1. 程式人生 > >資料加密 第一篇:值加密

資料加密 第一篇:值加密

加密是保護資料的一個方法,使用者只有拿到金鑰和證書把資料解密之後,才能使用資料。如果沒有金鑰和證書,即使得到了資料,也無法得知資料的原始值,資料就沒有價值了。由於資料的加密和解密是一種資源密集性(特別是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 Algor