SQL Server 數據安全篇(一) ->> 證書密鑰加密

SQL Server加密是指通過使用密鑰或密碼對數據進行模糊處理的過程,可以在SQL Server中對連接、數據和存儲過程使用加密。SQL Server 2005之前是不支持數據庫加密的,從2005開始可以對數據庫的列進行數據加密。

 

我覺得要理解SQL Server數據加密應該從下面幾個步驟去理解:

1、數據加密的層次結構是什麼?

2、證書、對稱密鑰和非對稱密鑰的區別

3、加密算法有哪些?

4、T-SQL編程實現數據加密(包括數據庫函數、加密解密編程)

 

數據加密的層次結構

SQL Server 使用分層加密和密鑰管理基礎結構來加密數據。 每一層都使用證書、非對稱密鑰和對稱密鑰的組合對它下面的一層進行加密。

 

下面這個圖是MSDN在線文檔截來的

 

 

第一層:數據庫實例在安裝的時候就會生成一個服務主密鑰(Service Master Key),本身由Windows提供的數據保護API進行保護(Data Pertection API)。它除了提供後面數據庫級別的加密服務外,還提供一些實例級別的加密功能,比如實例的登錄名密碼或者鏈接服務器的信息。

第二層:數據庫主密鑰(Database Master Key)。服務主密鑰和所有數據庫主密鑰是對稱密鑰。

第三層:證書\對稱密鑰\非對稱密鑰,對稱密鑰或非對稱密鑰保存在 SQL Server 外部的可擴展密鑰管理 (EKM) 模塊。對稱密鑰的加密解密性能肯定是大大好於證書或非對稱密鑰,所以加密數據應該選擇對稱密鑰,然後用非對稱密鑰或證書加密對稱密鑰來達到安全性和性能的平衡。

 

 總結:

1、加密層次也是由實例->數據庫->數據這樣一層層提供保護的

2、非對稱密鑰由於加密解密的複雜度使得它對CPU資源的消耗巨大,不適合用於直接加密數據,應該是選擇對稱密鑰來加密數據,然後用非對稱密鑰來加密對稱密鑰;

 

證書、對稱密鑰和非對稱密鑰的區別

 

證書

證書加密是通過CA簽名頒發公鑰證書,且每個證書都是有有效期限。證書籤名用於證明主體的公鑰和標識符信息之間的綁定的有效性。

SQL Server創建證書有幾種方式:

1、自簽名生成;

2、外部導入公鑰證書pfx文件,指定加密密碼對證書進行保護

  2.1 外部導入公鑰證書pfx文件,同時指定pvk私鑰文件路徑

 

自簽名例子:

CREATE CERTIFICATE Shipping04   
   ENCRYPTION BY PASSWORD = 'pGFD4bb925DGvbd2439587y'  
   WITH SUBJECT = 'Sammamish Shipping Records',   
   EXPIRY_DATE = '20201031';  

 

外部導入CER公鑰和PVK私鑰文件例子,同時指定私鑰文件解密密碼

CREATE CERTIFICATE Shipping11   
    FROM FILE = 'c:\Shipping\Certs\Shipping11.cer'   
    WITH PRIVATE KEY (FILE = 'c:\Shipping\Certs\Shipping11.pvk',   
    DECRYPTION BY PASSWORD = 'sldkflk34et6gs%53#v00');  

 

通過帶有私鑰的PFX證書文件創建證書,同時指定私鑰文件解密密碼

CREATE CERTIFICATE Shipping04
    FROM FILE = 'c:\storedcerts\shipping04cert.pfx'
    WITH 
    FORMAT = 'PFX', 
    PRIVATE KEY (
        DECRYPTION BY PASSWORD = '9n34khUbhk$w4ecJH5gh'
    );  

 

非對稱密鑰

“非對稱密鑰”是數據庫級的安全對象實體。 該實體的默認格式包含公鑰和私鑰。 當未使用 FROM 子句執行時,CREATE ASYMMETRIC KEY 會生成新的密鑰對。 使用 FROM 子句執行時,CREATE ASYMMETRIC KEY 會從文件中導入密鑰對。如果沒有指定ENCRYPTION BY PASSWORD,私鑰受數據庫主密鑰保護。非對稱密鑰的算法只支持RSA,只是不同的長度。

 

CREATE ASYMMETRIC KEY PacificSales09   
    WITH ALGORITHM = RSA_2048   
    ENCRYPTION BY PASSWORD = '<enterStrongPasswordHere>';   

 

對稱密鑰

對稱密鑰可以由證書、非對稱密鑰或密碼加密。對稱密鑰加密算法有DES、3DES和AES。推薦AES。

 

CREATE SYMMETRIC KEY JanainaKey09   
WITH ALGORITHM = AES_256  
ENCRYPTION BY CERTIFICATE Shipping04;  

 

 加密算法有哪些

SQL Server支持DES、Triple DES、TRIPLE_DES_3KEY、RC2、RC4、128 位 RC4、DESX、128 位 AES、192 位 AES 和 256 位 AES。從 SQL Server 2016 (13.x)開始,除 AES_128、AES_192 和 AES_256 以外的所有算法都已過時。 若要使用舊算法(不推薦),必須將數據庫設置爲兼容級別 120 或更低。所以對稱加密算法推薦AES且128以上長度,非對稱算法使用RSA。

 

T-SQL編程實現數據加密(包括數據庫函數、加密解密編程)

 

SQL Server在2005引入了列加密的功能。使得可以利用證書,對稱密鑰和非對稱密鑰對特定的列進行加密。在具體的實現上,根據加密解密的方式不同,內置了4對函數用於加密解密:

1. EncryptByCert()  和DecryptByCert()—利用證書對數據進行加密和解密

2. EncryptByAsymKey()  and DecryptByAsymKey()—利用非對稱密鑰對數據進行加密和解密

3. EncryptByKey()  and DecryptByKey()—利用對稱密鑰對數據進行加密和解密

4. EncryptByPassphrase()  and DecryptByPassphrase()—利用密碼字段產生對稱密鑰對數據進行加密和解密

 

對稱密鑰+證書的加密例子

USE AdventureWorks2019
GO

--創建證書,指定證書加密密碼,指定過期日期。如果下面不指定密碼,意味着證書由數據庫主密鑰保護,後面的OPEN SYMMETRIC KEY的時候就不需要指定PASSWORD了
CREATE CERTIFICATE Test_Certficate
ENCRYPTION BY PASSWORD = 'mypassword'  
WITH SUBJECT = 'for data encryption',   
EXPIRY_DATE = '2025/12/31';  
GO

--創建對稱密鑰,通過證書加密,加密算法用AES,長度256
CREATE SYMMETRIC KEY SymmetrickKeyForCert
    WITH ALGORITHM = AES_256
    ENCRYPTION BY CERTIFICATE Test_Certficate;
GO

DROP TABLE IF EXISTS dbo.test_table_for_encrpt
GO

--創建測試表
CREATE TABLE dbo.test_table_for_encrpt
(
    ID BIGINT IDENTITY(1,1) PRIMARY KEY,
    mobile VARBINARY(8000),
    mobile2 VARBINARY(8000)
)
GO

/*使用對稱密鑰之前(也就是解密和加密),都需要用OPEN SYMMETRIC KEY語句先打開對稱密鑰,
這裏如果你沒有對稱密鑰的使用權限你是沒辦法解密數據的
*/
OPEN SYMMETRIC KEY SymmetrickKeyForCert
DECRYPTION BY CERTIFICATE Test_Certficate
WITH PASSWORD='mypassword'

-- 加密是區分UNICODE和非UNICODE
INSERT INTO dbo.test_table_for_encrpt(mobile,mobile2)
SELECT ENCRYPTBYKEY(KEY_GUID('SymmetrickKeyForCert'),'13715918123')
,ENCRYPTBYKEY(KEY_GUID('SymmetrickKeyForCert'),N'13715918123')

-- 這裏可以看到,如果CONVERT的數據類型錯了,解密出來的文本是不對的
SELECT CONVERT(VARCHAR, DECRYPTBYKEY(mobile)),CONVERT(NVARCHAR, DECRYPTBYKEY(mobile2)),
CONVERT(NVARCHAR, DECRYPTBYKEY(mobile)),CONVERT(VARCHAR, DECRYPTBYKEY(mobile2))
FROM dbo.test_table_for_encrpt

 

結果

 

 

 

 

非對稱密鑰加密例子

USE AdventureWorks2019
GO

--創建數據庫主密鑰,不然後面創建非對稱密鑰就需要指定密碼,不指定密碼就默認由數據庫主密鑰保護
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'mypassword';
GO

--創建非對稱密鑰
CREATE ASYMMETRIC KEY Test_AsymKey
WITH ALGORITHM = RSA_2048
GO

--創建對稱密鑰,通過非對稱密鑰加密,加密算法用AES,長度256
CREATE SYMMETRIC KEY SymmetrickKeyForAsymKey
    WITH ALGORITHM = AES_256
    ENCRYPTION BY ASYMMETRIC KEY Test_AsymKey;
GO

DROP TABLE IF EXISTS dbo.test_table_for_encrpt2
GO

--創建測試表
CREATE TABLE dbo.test_table_for_encrpt2
(
    ID BIGINT IDENTITY(1,1) PRIMARY KEY,
    mobile VARBINARY(8000),
    mobile2 VARBINARY(8000)
)
GO

/*使用對稱密鑰之前(也就是解密和加密),都需要用OPEN SYMMETRIC KEY語句先打開對稱密鑰,
這裏如果你沒有對稱密鑰的使用權限你是沒辦法解密數據的
*/
OPEN SYMMETRIC KEY SymmetrickKeyForAsymKey
DECRYPTION BY ASYMMETRIC KEY Test_AsymKey


-- 加密是區分UNICODE和非UNICODE
INSERT INTO dbo.test_table_for_encrpt2(mobile,mobile2)
SELECT ENCRYPTBYKEY(KEY_GUID('SymmetrickKeyForAsymKey'),'13715918123')
,ENCRYPTBYKEY(KEY_GUID('SymmetrickKeyForAsymKey'),N'13715918123')
--SELECT ENCRYPTBYCERT(CERT_ID('Test_Certficate'),'13715918123')

-- 這裏可以看到,如果CONVERT的數據類型錯了,解密出來的文本是不對的
SELECT CONVERT(VARCHAR, DECRYPTBYKEY(mobile)),CONVERT(NVARCHAR, DECRYPTBYKEY(mobile2)),
CONVERT(NVARCHAR, DECRYPTBYKEY(mobile)),CONVERT(VARCHAR, DECRYPTBYKEY(mobile2))
FROM dbo.test_table_for_encrpt2

 

 

參考:

加密層次結構

透明數據加密 (TDE)

加密密鑰

加密算法

可擴展的密鑰管理 (EKM)

CREATE CERTIFICATE (Transact-SQL)

CREATE ASYMMETRIC KEY (Transact-SQL)

OPEN SYMMETRIC KEY (Transact-SQL)

ENCRYPTBYKEY (Transact-SQL)

DECRYPTBYKEY (Transact-SQL)

CREATE ASYMMETRIC KEY (Transact-SQL)

CREATE MASTER KEY (Transact-SQL)

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