在《SQL Server 非對稱祕鑰在數據加密中的應用》一文中,我們瞭解到可以使用非對稱祕鑰進行數據加密。本文帶着大家深入瞭解非對稱祕鑰的生命週期,包括創建、修改和刪除。
爲了熟悉非對稱祕鑰,我們先創建一個數據庫作爲測試環境:
CREATE DATABASE AsymmetricKeyAdmin ON PRIMARY
(NAME='AsymmetricKeyAdmin',FILENAME='D:\database\AsymmetricKeyAdmin.mdf')
LOG ON
(NAME='AsymmetricKeyAdmin_log',FILENAME='D:\database\AsymmetricKeyAdmin_log.ldf')
創建非對稱祕鑰
非對稱祕鑰的創建有五種方式,分別爲:
-
密碼加密私鑰的非對稱祕鑰
-
DMK加密私鑰的非對稱祕鑰
-
從強命名加密的dll文件中創建
-
從文件中創建
-
從EKM中創建
密碼加密私鑰的非對稱祕鑰創建
USE AsymmetricKeyAdmin
GO
--創建密碼加密的非對稱密鑰
CREATE ASYMMETRIC KEY AsyEncryptByPWD
WITH ALGORITHM=RSA_2048
ENCRYPTION BY PASSWORD='[J,XJK8|AwE*rLk'
從動態視圖sys.asymmetric_keys 我們可以清楚的看到,該非對稱密鑰是使用密碼加密的,同時我們可以看到,在這裏有個公鑰字段public_key,這個是對稱密鑰所沒有的。
DMK加密私鑰的非對稱祕鑰
--創建數據庫主密鑰
CREATE MASTER KEY ENCRYPTION BY PASSWORD='[J,XJK8|AwE*rLk'
--創建數據庫主密鑰加密的非對稱密鑰
CREATE ASYMMETRIC KEY AsyEncrptyByDMK
WITH ALGORITHM=RSA_2048
非對稱祕鑰算法的選擇,可參考《SQL Server 非對稱祕鑰加密算法RSA》。
從強名稱加密的dll中創建非對稱祕鑰
--從強名稱加密的dll中創建非對稱密鑰
CREATE ASYMMETRIC KEY AsyKeyFromDll
FROM EXECUTABLE FILE='E:\AsmDll\UDF_CLR.dll'
從強名稱加密的dll中創建的非對稱祕鑰是沒有私鑰的,公鑰是存在的。
注意:dll的強名稱加密過程可以參考《解決因SQL Server數據庫引用程序集而不得不開啓trustworthy方法》文章中的描述。
使用程序集創建非對稱祕鑰
這裏我們仍然使用上文中使用的UDF_CLR.dll,不過是使用它先創建程序集,然後再用該程序集創建非對稱祕鑰。
--不開啓用trustworthy 時,創建程序集方案:
USE master --這個數據庫一定是master
GO
--創建非對稱密鑰
CREATE ASYMMETRIC KEY SQLCLRTestKey FROM EXECUTABLE FILE = 'E:\AsmDll\UDF_CLR.dll'
--創建登錄名
CREATE LOGIN SQLCLRTestLogin FROM ASYMMETRIC KEY SQLCLRTestKey
--把權限授予給該登錄名
GRANT EXTERNAL ACCESS ASSEMBLY TO SQLCLRTestLogin;
USE AsymmetricKeyAdmin
GO
--創建程序集
CREATE ASSEMBLY UDF FROM
'E:\AsmDll\UDF_CLR.dll'
WITH PERMISSION_SET=EXTERNAL_ACCESS;
--使用程序集創建非對稱密鑰
CREATE ASYMMETRIC KEY AsyKeyFromAssembly
FROM ASSEMBLY UDF
此時會報如下錯誤:
因爲我們上文使用UDF_CLR.dll 創建了非對稱祕鑰,即使用同一個dll創建非對稱祕鑰,無論是直接使用dll文件創建,還是間接的使用程序集創建,這兩個非對稱祕鑰是相同的,所以會報非對稱祕鑰已經存在的錯誤。
接下來我們先刪除上文創建的非對稱祕鑰 AsyKeyFromDll :
USE AsymmetricKeyAdmin
GO
--先刪除非對稱祕鑰AsyKeyFromDll
DROP ASYMMETRIC KEY AsyKeyFromDll
再執行如下創建非對稱祕鑰的腳本:
--使用程序集創建非對稱密鑰
CREATE ASYMMETRIC KEY AsyKeyFromAssembly
FROM ASSEMBLY UDF
創建成功,檢查動態視圖:
仍然沒有私鑰存在。
使用強名稱加密的私鑰文件創建非對稱祕鑰
--使用文創建非對稱密鑰
CREATE ASYMMETRIC KEY AsyKeyFromFile
FROM FILE='E:\AsmDll\pri.snk'
--刪除從程序集中創建的非對稱密鑰AsyKeyFromAssembly
DROP ASYMMETRIC KEY AsyKeyFromAssembly
再次執行使用文件創建非對稱祕鑰的腳本,創建成功。我們查看動態視圖:
和從dll創建非對稱祕鑰、從程序集中創建非對稱祕鑰不同的是,從文件中創建的非對稱祕鑰是使用數據庫主祕鑰進行加密的(因爲本文前面創建數據庫主祕鑰加密的非對稱祕鑰中已經創建了DMK,否則在從文件中創建非對稱祕鑰之前需要先創建DMK)。
使用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:\AsmDll路徑下,文件名爲UDF_CLR.dll,先創建 CRYPTOGRAPHIC PROVIDER
CREATE CRYPTOGRAPHIC PROVIDER EKM_Prov
FROM FILE = 'E:\CertExeFile\UDF_CLR.dll' ;
GO
使用EKM創建非對稱祕鑰:
--使用EKM創建非對稱密鑰
CREATE ASYMMETRIC KEY AsyKey
FROM PROVIDER EKM_Prov
WITH
PROVIDER_KEY_NAME='KeyForSensitiveData',
CREATION_DISPOSITION=OPEN_EXISTING;
GO
修改非對稱祕鑰
修改私鑰加密密碼:
ALTER ASYMMETRIC KEY AsyEncryptByPWD
WITH PRIVATE KEY (
DECRYPTION BY PASSWORD='[J,XJK8|AwE*rLk'
,ENCRYPTION BY PASSWORD ='0faalc23(gI0r;>'
)
將密碼加密非對稱祕鑰私鑰更改爲DMK加密非對稱祕鑰私鑰
OPEN MASTER KEY DECRYPTION BY PASSWORD = '[J,XJK8|AwE*rLk';
ALTER ASYMMETRIC KEY AsyEncryptByPWD WITH PRIVATE KEY (
DECRYPTION BY PASSWORD = '[J,XJK8|AwE*rLk' );
CLOSE MASTER KEY
注意:
-
數據庫必須已經存在數據庫主祕鑰,否則需要先創建DMK
-
更改前需要先打開數據庫主祕鑰
可以使用如下方式將DMK加密非對稱祕鑰私鑰更改爲密碼加密:
ALTER ASYMMETRIC KEY AsyEncryptByPWD WITH PRIVATE KEY(
ENCRYPTION BY PASSWORD ='[J,XJK8|AwE*rLk')
SELECT * FROM sys.asymmetric_keys
移除非對稱祕鑰私鑰
ALTER ASYMMETRIC KEY AsyEncryptByPWD
REMOVE PRIVATE KEY
值得注意的是,私鑰一旦移除,就不能使用ALTER ASYMMETRIC KEY 添加了:
同樣我們也不能爲上文中使用dll或程序集創建的非對稱祕鑰添加私鑰。
沒有私鑰,也就沒有辦法解密了,這和我們後面將會提到的永久加密有些異曲同工的效果。