­

數據加密 第一篇:值加密

加密是保護數據的一個方法,用戶只有拿到密鑰和證書把數據解密之後,才能使用數據。如果沒有密鑰和證書,即使得到了數據,也無法得知數據的原始值,數據就沒有價值了。由於數據的加密和解密是一種資源密集性(特別是CPU和I/O )的操作,同時加密後的數據量會增大,因此,往往會帶來查詢性能的下降,一般只會對敏感數據加密。SQL Server提供的加密方式主要是值級加密(Cell Level)和文件級別加密(TDE)。

SQL Server提供的加密機制主要有:

  • 加密函數
  • 非對稱鍵(Asymmetric keys)和對稱鍵(Symmetric keys)
  • 憑證(Certificates)
  • 透明數據加密(Transparent Data Encryption,簡稱TDE)

一,加密演算法

加密演算法用於把數據轉換成密文,從SQL Server 2016 (13.x)開始,除了AES_128, AES_192 和 AES_256 之外,其他加密演算法都已經過時了。 

在選擇加密機制時,可以借鑒一些成功的經驗:

  • 強的加密通常意味著消耗更多的CPU資源;
  • 長的密鑰比短密鑰的加密效果更好;
  • 長密碼比短密碼的加密效果更好
  • 非對稱加密比對稱加密更慢,但是加密效果更好;
  • 如果要加密大量的數據,推薦使用對稱密鑰加密數據,然後使用非對稱密鑰加密該非對稱密鑰。
  • 密文不能被加密,但是,壓縮後的數據可以被加密,推薦在壓縮後再加密數據。

二,使用密碼或短語來加密數據

對於單個值,可以使用TSQL函數EncryptByPassPhrase()進行加密,使用DecryptByPassPhrase()進行解密。傳遞一個短語作為密碼,使用128bit鍵長的TRIPLE DES 演算法進行加密。

EncryptByPassPhrase ( 'passphrase', 'cleartext' [ , add_authenticator , authenticator ] )
DecryptByPassPhrase ( 'passphrase', 'ciphertext' [ , add_authenticator ,authenticator  ] ) 

參數注釋:

  • passphrase:字元串,用於生成對稱鍵
  • cleartext:需要加密的字元串,數據類型可以是:nvarchar, char, varchar, binary, varbinary, 或 nchar,不能超過8000Bytes。
  • ciphertext:密文,是加密之後的數據,數據類型是varbinary。
  • add_authenticator:布爾值,是否把authenticatory和cleartext以及加密。如果是1,authenticator參數必須有值。默認值是0,可以省略參數add_authenticator和authenticator。
  • authenticator:sysname類型,用於指示身份驗證者

返回值:這兩個函數的返回值都是varbinary,最大長度是8000Bytes。

舉個例子,使用這兩個函數對數據進行加密和解密:

declare @cipher varbinary(8000)
select @cipher=Encryptbypassphrase(N'悅光陰','A good man')
select @cipher as EncryptedText,cast(Decryptbypassphrase(N'悅光陰',@cipher) as varchar(128)) as DecryptedText

 三,密鑰和證書

密鑰分為對稱密鑰和非對稱密鑰。

  • 對稱密鑰(Symmetric Keys)是指加密和解密的過程使用相同的演算法,是加密中最弱的演算法,但是性能最好。對於對稱密鑰,可以使用密碼或者另一個密鑰甚至一個證書來加密。
  • 非對稱密鑰(Asymmetric Keys)使用一對密鑰(演算法),一個密鑰用於加密,另一個密鑰用於解密,加密的密鑰稱為私鑰(private key),解密的密鑰稱為公鑰(public key)。

證書(Certificates)全稱是公鑰證書,是一種數字簽名,它把公鑰綁定到擁有相應私鑰的個人身份。證書由證書頒發機構(CA)頒發和簽名。從CA接收證書的實體是證書主題,證書主題擁有以下資訊:

  • 公鑰
  • 證書的標識資訊
  • 證書的有效期
  • 發行者標識符資訊。
  • 發行人的數字簽名。

證書的主要好處是,使管理員避免了對每一個實體都需要維護一個密碼的,取而代之,管理員僅建立對證書頒發者的信任,然後證書頒發者可以簽署無限數量的證書。

1,創建證書

管理員使用CREATE CERTIFICATE命令來創建證書:

CREATE CERTIFICATE certificate_name 
[ ENCRYPTION BY PASSWORD = 'password' ]   
WITH SUBJECT = 'certificate_subject_name'   
[ , START_DATE = 'datetime' | EXPIRY_DATE = 'datetime']

證書的子句注釋:

  • ENCRYPTION BY PASSWORD =’password‘:指定用於加密私鑰的密碼,私鑰其實就是證書名稱。只有在使用密碼加密證書時才會使用該選項,如果省略該選項,那麼使用資料庫主密鑰(Database Master Key)來加密私鑰。
  • SUBJECT =’certificate_subject_name‘:證書的主題名稱

管理員可以把已創建的證書授權給相應的人員來使用:

GRANT permission  [ ,...n ]    
    ON CERTIFICATE :: certificate_name   
    TO principal [ ,...n ] 

2,創建對稱密鑰

當創建對稱密鑰之後,對稱密鑰必須用至少一個方式來加密: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  

四,使用對稱密鑰來加密和解密數據

創建證書來對對稱密鑰進行加密。

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 ; 

 

參考文檔:

SQL Server Encryption

Choose an Encryption Algorithm