數據加密 第四篇:對稱密鑰
- 2020 年 5 月 18 日
- 筆記
- Security, SQL Server 安全
密鑰分為對稱密鑰和非對稱密鑰,密鑰本質上是加密數據的演算法:
- 對稱密鑰(Symmetric Keys)是指加密和解密的過程使用相同的演算法,是加密中最弱的演算法,但是性能最好。對於對稱密鑰,可以使用密碼或者另一個密鑰甚至一個證書來加密。
- 非對稱密鑰(Asymmetric Keys)使用一對密鑰(演算法),一個密鑰用於加密,另一個密鑰用於解密,加密的密鑰稱為私鑰(private key),解密的密鑰稱為公鑰(public key)。
對稱密鑰(Symmetric Keys)
雖然是「鑰匙」,但是本質是加密數據的演算法,並且是加密中最弱的演算法,這是因為使用相同的演算法來加密和解密數據。不過即使是最弱的演算法,也能增加數據防禦的能力,畢竟不是每個攻擊者都是頂級的。對於對稱密鑰,可以使用密碼,或者另一個密鑰,甚至一個證書來加密。
非對稱密鑰(Asymmetric Keys)
跟對稱密鑰相對,它使用一對密鑰(演算法),一個密鑰用於加密,另一個密鑰用於解密,加密的密鑰稱為私鑰(private key),解密的密鑰稱為公鑰(public key)。跟對稱密鑰相比,非對稱密鑰提供的安全級別更高,也更消耗資源。
一,創建對稱密鑰
創建對稱密鑰時,需要制定對數據進行加密的演算法,對稱密鑰必須用至少一個方式來加密:certificate, password, symmetric key, asymmetric key, 或 PROVIDER,密鑰可以同時有多種加密方式。
CREATE SYMMETRIC KEY key_name WITH ALGORITHM = { AES_128 | AES_192 | AES_256 } , ENCRYPTION BY <encrypting_mechanism> [ , ... n ] <encrypting_mechanism> ::= CERTIFICATE certificate_name | PASSWORD = 'password' | SYMMETRIC KEY symmetric_key_name | ASYMMETRIC KEY asym_key_name
舉個例子,創建一個對稱密鑰,使用AES_256對數據進行加密,並使用證書對密鑰進行加密:
CREATE SYMMETRIC KEY JanainaKey09 WITH ALGORITHM = AES_256 ENCRYPTION BY CERTIFICATE Shipping04; GO
二,使用對稱密鑰來加密和解密數據的函數
在對稱密鑰創建完成之後,要使用對稱密鑰對數據進行加密,首先要打開對稱密鑰,對稱密鑰的GUID可以通過函數key_GUID(‘name’)來獲得:
OPEN SYMMETRIC KEY Key_name DECRYPTION BY <decryption_mechanism> <decryption_mechanism> ::= CERTIFICATE certificate_name [ WITH PASSWORD = 'password' ] | ASYMMETRIC KEY asym_key_name [ WITH PASSWORD = 'password' ] | SYMMETRIC KEY decrypting_Key_name | PASSWORD = 'decryption_password'
當對稱密鑰打開之後,使用EncryptByKey ()來對數據進行加密,返回值是varbinar,最大長度是8000Bytes:
EncryptByKey ( key_GUID , { 'cleartext' | @cleartext } [, { add_authenticator | @add_authenticator } , { authenticator | @authenticator } ] )
使用DecryptByKey ()來對數據進行解密:
DecryptByKey ( { 'ciphertext' | @ciphertext } [ , add_authenticator, { authenticator | @authenticator } ] )
在不使用對稱密鑰時,把密鑰關閉:
CLOSE SYMMETRIC KEY key_name
三,使用對稱密鑰來加密和解密數據的實例
創建證書來對對稱密鑰進行加密。
1,使用對稱密鑰加密數據
Step1,創建證書,並使用資料庫主密鑰來加密證書
CREATE CERTIFICATE CreditCardCert WITH SUBJECT = 'Credit Card Numbers';
Step2:創建對稱密鑰
創建一個名稱為CreditCardKey的對稱密鑰,使用AES_128加密演算法,並使用證書對密鑰進行加密
CREATE SYMMETRIC KEY CreditCardKey WITH ALGORITHM = AES_128 ENCRYPTION BY CERTIFICATE CreditCardCert;
從 SQL Server 2016開始,除 AES_128、AES_192 和 AES_256 以外的所有演算法都已過時。
Step 3:解密對稱密鑰並使其可供使用
使用密鑰前需要解密對稱密鑰,然後打開密鑰,否則密鑰不可用
OPEN SYMMETRIC KEY CreditCardKey DECRYPTION BY CERTIFICATE CreditCardCert;
Step4:使用密鑰對數據進行加密
調用ENCRYPTBYKEY()函數使用對稱密鑰對數據進行加密
UPDATE Sales.CreditCard SET CardNumberEncrypted = ENCRYPTBYKEY(Key_GUID('CreditCardKey'), CardNumber);
函數 KEY_GUID(‘key_name’)返回對稱密鑰的GUID。
Step 5:關閉密鑰
密鑰的打開狀態對當前Session起作用,在使用玩密鑰之後,應該及時把密鑰關閉。
CLOSE SYMMETRIC KEY CreditCardKey ;
2,解密對稱密鑰
首先打開對稱密鑰,然後使用對稱密鑰解密數據,最後關閉密鑰
OPEN SYMMETRIC KEY CreditCardKey DECRYPTION BY CERTIFICATE CreditCardCert; SELECT CONVERT(NVARCHAR(30), DECRYPTBYKEY(CardNumberEncrypted)) AS CreditCardNumber FROM Sales.CreditCard ; CLOSE SYMMETRIC KEY CreditCardKey ;
參考文檔:
CREATE SYMMETRIC KEY (Transact-SQL)