金鑰分為對稱金鑰和非對稱金鑰,金鑰本質上是加密資料的演算法:
- 對稱金鑰(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 ;
參考文件: