數據加密 第一篇:值加密
- 2020 年 5 月 8 日
- 筆記
- encryption, Security, SQL Server 安全
加密是保護數據的一個方法,用戶只有拿到密鑰和證書把數據解密之後,才能使用數據。如果沒有密鑰和證書,即使得到了數據,也無法得知數據的原始值,數據就沒有價值了。由於數據的加密和解密是一種資源密集性(特別是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 ;
參考文檔:
Choose an Encryption Algorithm