SQL Server 加密體系呈層級結構:**Windows DPAPI → 服務主鑰 (SMK) → 數據庫主鑰 (DMK) → 證書/非對稱鑰/對稱鑰 → 數據**。本文通過完整腳本演示:創建 DMK、非對稱鑰、對稱鑰、證書,並以對稱鑰加密列數據為例,展示 ENCRYPTBYKEY / DECRYPTBYKEY 實戰流程。
Windows DPAPI (保護 SMK)
↓
Service Master Key (SMK) - 安裝時自動生成
↓ 保護
Database Master Key (DMK) - CREATE MASTER KEY
↓ 保護
┌─ Certificate (證書) ──→ 對稱鑰
├─ Asymmetric Key (非對稱鑰) ──→ 對稱鑰
└─ Symmetric Key (對稱鑰) ─────→ 數據 (ENCRYPTBYKEY)
支持算法:AES_128/192/256, TRIPLE_DES, DESX (棄用), RC4 (棄用)
非對稱:RSA_512/1024/2048
CREATE MASTER KEY ENCRYPTION BY PASSWORD = N'Passw0rd'; -- 受 SMK 保護 GO
-- 非對稱鑰 (RSA_1024) CREATE ASYMMETRIC KEY asyc_key_enc WITH ALGORITHM = RSA_1024 ENCRYPTION BY PASSWORD = N'Pass@word'; GO -- 對稱鑰 (Triple_DES,密碼保護) CREATE SYMMETRIC KEY symc_key_enc WITH ALGORITHM = TRIPLE_DES ENCRYPTION BY PASSWORD = N'Pass@word'; GO -- 證書 (自簽名,有效期至 2099) CREATE CERTIFICATE cert_ENC WITH SUBJECT = 'certificate for ENC', EXPIRY_DATE = '20990101'; GO
-- 3.1 由非對稱鑰保護 CREATE SYMMETRIC KEY symc_key_enc_byAsyc WITH ALGORITHM = AES_128 ENCRYPTION BY ASYMMETRIC KEY asyc_key_enc; GO -- 3.2 由對稱鑰保護(需先 OPEN 父鑰) OPEN SYMMETRIC KEY symc_key_enc DECRYPTION BY PASSWORD = N'Pass@word'; CREATE SYMMETRIC KEY symc_key_enc_bySymc WITH ALGORITHM = DES ENCRYPTION BY SYMMETRIC KEY symc_key_enc; CLOSE SYMMETRIC KEY symc_key_enc; GO -- 3.3 由證書保護(推薦:證書可備份/還原/輪換) CREATE SYMMETRIC KEY symc_key_enc_byCert WITH ALGORITHM = AES_128 ENCRYPTION BY CERTIFICATE cert_ENC; GO
-- 建表與測試數據
CREATE TABLE tb (IDN INT, Name VARCHAR(20));
INSERT INTO tb VALUES (123456789,'BigBrother'),(090807001,'SpiderMan'),(336655789,'SuperMan');
GO
-- 新增加密列 (VARBINARY 存儲密文)
ALTER TABLE tb ADD Ency_IDN VARBINARY(128);
GO
-- 加密:OPEN 鑰 → ENCRYPTBYKEY(KEY_GUID('鑰名'), 明文二進制) → CLOSE 鑰
OPEN SYMMETRIC KEY symc_key_enc_byAsyc
DECRYPTION BY ASYMMETRIC KEY asyc_key_enc
WITH PASSWORD = N'Pass@word';
UPDATE tb
SET Ency_IDN = ENCRYPTBYKEY(KEY_GUID('symc_key_enc_byAsyc'), CONVERT(VARBINARY, IDN));
CLOSE SYMMETRIC KEY symc_key_enc_byAsyc;
GO
-- 解密:OPEN 鑰 → DECRYPTBYKEY(密文) → CONVERT 回目標類型 → CLOSE 鑰
OPEN SYMMETRIC KEY symc_key_enc_byAsyc
DECRYPTION BY ASYMMETRIC KEY asyc_key_enc
WITH PASSWORD = N'Pass@word';
SELECT
IDN,
Ency_IDN,
CONVERT(INT, DECRYPTBYKEY(Ency_IDN)) AS Decr_IDN
FROM tb;
CLOSE SYMMETRIC KEY symc_key_enc_byAsyc;
GO
| 函數對 | 保護實體 | 典型場景 |
|---|---|---|
ENCRYPTBYCERT / DECRYPTBYCERT | 證書 | 跨實例/備份還原場景,證書可攜帶私鑰導出 |
ENCRYPTBYASYMKEY / DECRYPTBYASYMKEY | 非對稱鑰 | 加密小數據(如鑰材交換),性能較差 |
ENCRYPTBYKEY / DECRYPTBYKEY | 對稱鑰 | 大批量業務列加密(首選),性能最佳 |
ENCRYPTBYPASSPHRASE / DECRYPTBYPASSPHRASE | 密碼派生鑰 | 臨時/輕量級,無需管理鑰對象 |
SHA2_256)建索引,查詢時比對哈希。列級加密保護靜態數據機密性,配合 TDE(透明數據加密)保護整庫文件,構建纵深防禦體系。