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