數據加密 第四篇:對稱密鑰

密鑰分為對稱密鑰和非對稱密鑰,密鑰本質上是加密數據的演算法:

  • 對稱密鑰(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)