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
參考:
CREATE CERTIFICATE (Transact-SQL)
CREATE ASYMMETRIC KEY (Transact-SQL)
OPEN SYMMETRIC KEY (Transact-SQL)