資料加密 第四篇:對稱金鑰

悅光陰發表於2020-05-18

金鑰分為對稱金鑰和非對稱金鑰,金鑰本質上是加密資料的演算法:

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

相關文章