對稱祕鑰,加密和解密使用相同的祕鑰。
對稱祕鑰的應用:《SQL Server 對稱密鑰在數據加密中的應用》
對稱祕鑰的管理包括創建、打開、修改、關閉和刪除,本文將逐一使用實例進行介紹。
創建對稱祕鑰
創建對稱祕鑰必定要指定一種加密方式,而對稱祕鑰有五種加密方式,分別爲證書、密碼、對稱祕鑰、非對稱祕鑰和PROVIDER。我們將按照對稱祕鑰的加密方式給出創建祕鑰的樣例。
爲了演示創建過程,我們先創建一個測試數據庫:
--創建測試數據庫
CREATE DATABASE SymmetricKeyAdmin ON PRIMARY
(NAME='SymmetricKeyAdmin',FILENAME='D:\database\SymmetricKeyAdmin.mdf')
LOG ON
(NAME='SymmetricKeyAdmin_log',FILENAME='D:\database\SymmetricKeyAdmin_log.ldf')
創建證書加密的對稱祕鑰
USE SymmetricKeyAdmin
GO
--創建數據庫主密鑰
CREATE MASTER KEY ENCRYPTION BY PASSWORD='[J,XJK8|AwE*rLk'
--創建證書
CREATE CERTIFICATE CertForEncryption
WITH SUBJECT ='Certficate for Encrypton Symmetric'
--創建證書加密的對稱密鑰
CREATE SYMMETRIC KEY AsyEncryptByCert
WITH ALGORITHM=AES_256
ENCRYPTION BY CERTIFICATE CertForEncryption
我們可以使用動態視圖 sys.symmetric_keys 、sys.key_encryptions查看對稱祕鑰的信息:
SELECT * FROM sys.symmetric_keys
SELECT * FROM sys.key_encryptions
結果如下:
密碼加密的對稱祕鑰
--創建密碼加密的對稱密鑰
CREATE SYMMETRIC KEY SyEncryptByPwd
WITH ALGORITHM=AES_256
ENCRYPTION BY PASSWORD ='0faalc23(gI0r;>'
創建對稱祕鑰加密的對稱祕鑰
--打開用來加密的對稱密鑰
OPEN SYMMETRIC KEY SyEncryptByPwd
DECRYPTION BY PASSWORD='0faalc23(gI0r;>'
--創建對稱密鑰加密的對稱密鑰
CREATE SYMMETRIC KEY SyEncryptBySy
WITH ALGORITHM=AES_256
ENCRYPTION BY SYMMETRIC KEY SyEncryptByPwd
--關閉用來加密的對稱密鑰
CLOSE SYMMETRIC KEY SyEncryptByPwd
注意:
-
這裏我們直接使用上面創建的密碼加密的對稱祕鑰AsyEncryptByPwd 來加密新祕鑰。
-
創建對稱祕鑰加密的對稱祕鑰時,需要先打開用來加密的對稱祕鑰,才能創建
創建非對稱祕鑰加密的對稱祕鑰
--創建非對稱密鑰
CREATE ASYMMETRIC KEY AsyForSyEncrypt
WITH ALGORITHM=RSA_2048
ENCRYPTION BY PASSWORD='0ipLMYf48w;do}?'
--創建非對稱密鑰加密的對稱密鑰
CREATE SYMMETRIC KEY SyEncryptByAsy
WITH ALGORITHM =AES_256
ENCRYPTION BY ASYMMETRIC KEY AsyForSyEncrypt
注意:以上幾種對稱祕鑰創建時可用的加密算法包括DES | TRIPLE_DES | TRIPLE_DES_3KEY | RC2 | RC4 | RC4_128 | DESX | AES_128 | AES_192 | AES_256,但從SQL Server 2016(13.x)開始,除 AES_128 | AES_192 | AES_256三種算法外,其他算法都被廢棄了。具體算法的選擇可參考《SQL Server 非對稱祕鑰的加密算法》一文。
使用EKM創建對稱祕鑰
在使用EKM時,我們首先需要啓用EKM provider,腳本如下:
-- 啓動高級配置
sp_configure 'show advanced options', 1 ;
GO
RECONFIGURE ;
GO
-- 啓動EKM provider
sp_configure 'EKM provider enabled', 1 ;
GO
RECONFIGURE ;
GO
假設第三加密提供程序存儲在E:\CertExeFile路徑下,文件名爲UDF_CLR.dll
CREATE CRYPTOGRAPHIC PROVIDER EKM_Prov
FROM FILE = 'E:\CertExeFile\UDF_CLR.dll' ;
GO
消息 33027,級別 16,狀態 1,第 211 行
無法加載庫 'E:\CertExeFile\UDF_CLR_Interface.dll'。有關詳細信息,請參閱錯誤日誌。
Failed to verify Authenticode signature on DLL 'E:\CertExeFile\UDF_CLR.dll'.
解決方案:
右擊文件UDF_CLR→屬性→數字簽名→點選證書→點選右下角的“詳細信息”
在數字簽名詳細信息彈窗中,點擊右下角的“查看證書”:
在證書彈窗中,常規標籤下,點擊下面的“安裝證書”:
在證書導入嚮導中,選擇“本地計算機(L)”,點擊下一步:
選擇“將所有的證書都放入下列存儲(P)”,然後點證書存儲文本框右側的“瀏覽”:
在彈出的選擇證書存儲彈窗中,選擇“受信任的根證書頒發機構”:
點擊確定後,返回證書導入嚮導:
點擊“下一步”
點擊完成:
跳出“導入成功”提示彈窗,點擊確定即可。
再次執行創建CRYPTOGRAPHIC PROVIDER腳本,報dll缺少方法的錯誤:
消息 33085,級別 16,狀態 1,第 211 行
在加密提供程序庫 'E:\CertExeFile\UDF_CLR.dll' 中找不到一個或多個方法。
當遇到這樣的問題時,只能根據提供程序的供應商文檔解決了。
使用EKM創建對稱祕鑰:
CREATE SYMMETRIC KEY SymFromEKM
AUTHORIZATION User1
FROM PROVIDER EKM_Prov
WITH
PROVIDER_KEY_NAME='KeyForSensitiveData',
CREATION_DISPOSITION=OPEN_EXISTING;
GO
注意:CREATION_DISPOSITION參數有兩個值,一個爲REATE_NEW,在EKM 設備上創建一個新的祕鑰,如果設備已經存在,則創建語句將出錯;另外一個即實例中使用的OPEN_EXISTING,將SQL Server對稱祕鑰映射到一個已經存在的EKM祕鑰。默認情況下,使用的是CREATE_NEW。
如需深入理解EMK,可參考《SQL Server 擴展祕鑰管理(EKM)》一文。
創建臨時對稱祕鑰
創建臨時對稱祕鑰是在名稱前加一個#號
不能使用EKM創建臨時證書
臨時證書爲創建者所擁有,臨時祕鑰只對當前的會話有效。
IDENTITY_VALUE 產生一個GUID,使用它標記由新對稱祕鑰加密的的數據。這個標記可以用來匹配祕鑰和加密數據。由特定語句生成的GUID總是相同的。在語句被使用生成GUID 後,這個語句直到至少一個會話已經調用該語句,才能重新被使用。IDENTITY_VALUE是可選選項,然而,當我們存儲臨時祕鑰加密的數據時,我們推薦使用它。
對稱祕鑰的更改
對稱祕鑰的更改包括增加新的加密方式,或者刪除已有的加密方式。值得注意的是,對稱祕鑰需要至少一種加密方式,因此,我們最好是現在增加加密方式,再刪除已有的加密方式。
修改對稱祕鑰時,我們需要先打開它,如下面我們修改上文中創建的使用對稱祕鑰加密的對稱祕鑰 SyEncryptByCert
--打開對稱密鑰
OPEN SYMMETRIC KEY SyEncryptByPwd
DECRYPTION BY PASSWORD='0faalc23(gI0r;>'
OPEN SYMMETRIC KEY SyEncryptBySy
DECRYPTION BY SYMMETRIC KEY SyEncryptByPwd
--增加密碼加密
ALTER SYMMETRIC KEY SyEncryptBySy
ADD ENCRYPTION BY PASSWORD='0ipLMYf48w;do}?'
--刪除對稱密鑰加密
ALTER SYMMETRIC KEY SyEncryptBySy
DROP ENCRYPTION BY SYMMETRIC KEY SyEncryptByPwd
--關閉對稱密鑰
CLOSE SYMMETRIC KEY SyEncryptBySy
注意:因爲要修改的對稱祕鑰是用對稱祕鑰加密的,所以除了在打開要更改的對稱祕鑰之前,還需要打開加密它的對稱祕鑰。修改完成後,最後還需要關閉該對稱祕鑰。
刪除不需要的對稱祕鑰
刪除對稱祕鑰SyEncryptBySy ,腳本如下:
DROP SYMMETRIC KEY SyEncryptBySy