SQL Server 非對稱祕鑰管理

​在《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或程序集創建的非對稱祕鑰添加私鑰。

 

沒有私鑰,也就沒有辦法解密了,這和我們後面將會提到的永久加密有些異曲同工的效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章