加密是指通過使用密鑰或密碼對數據進行模糊處理的過程,加密解密最簡單的過程如下圖所示:
對稱加密是加密和解密使用同一個密鑰的加密算法,在圖中就是加密密鑰和解密密鑰是相同的。對稱加密通常來說會比較羸弱,因為使用數據時不僅僅需要傳輸數據本身,還是要通過某種方式傳輸密鑰,這很有可能使得密鑰在傳輸的過程中被竊取。
非對稱加密是加密和解密使用不同密鑰的加密算法,在圖中就是加密密鑰和解密密鑰是不同的。用於加密的密鑰稱之為公鑰,用於解密的密鑰稱之為私鑰。因此安全性相比對稱加密來說會大大提高。當然有一長必有一短,非對稱加密的方式通常算法會相比對稱密鑰來說復雜許多,因此會帶來性能上的損失。
因此,一種折中的辦法是使用對稱密鑰來加密數據,而使用非對稱密鑰來加密對稱密鑰。這樣既可以利用對稱密鑰的高性能,還可以利用非對稱密鑰的可靠性。
沒有一個加密算法能夠適用所有的情況,在選擇加密機制時,可以借鑒一些成功的經驗:
- 強的加密通常意味着消耗更多的CPU資源;
- 長的密鑰比短密鑰的加密效果更好;
- 長密碼比短密碼的加密效果更好
- 非對稱加密比對稱加密更慢,但是加密效果更好;
- 如果要加密大量的數據,推薦使用對稱密鑰來加密數據,然后使用非對稱密鑰加密該非對稱密鑰。
- 密文不能被壓縮,但是,壓縮后的數據可以被加密,推薦在壓縮數據后再對數據進行加密。
加密算法
加密算法用於把數據轉換成密文,從SQL Server 2016 (13.x)開始,除了AES_128, AES_192 和 AES_256 之外,其他加密算法都已經過時了。
關於DES算法的說明:
- 使用ALGORITHM = TRIPLE_DES_3KEY 創建的對稱密鑰,是指192bit的TRIPLE DES
- 使用ALGORITHM = TRIPLE_DES 創建的對稱密鑰,是指128bit的TRIPLE DES
加密機制
SQL Server提供的加密方式主要是值級加密(Cell Level)和文件級別加密(TDE)。SQL Server提供的加密機制主要有:
- 加密函數:使用短語作為密碼對數據進行加密
- 非對稱密鑰(Asymmetric keys)和對稱密鑰(Symmetric keys)
- 憑證(Certificates)
- 透明數據加密(Transparent Data Encryption,簡稱TDE),對整個數據庫文件進行加密
使用短語加密數據
對於單個值,可以使用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
參考文檔: