首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

DB2 內置加密函數實戰:列級與單元格級數據保護方案

     編輯:DB2 教學

為什麼需要數據庫級加密?

傳統權限控制只能阻擋未授權訪問,但 DBA 仍可見敏感數據(如信用卡號、身份證號)。合規與業務場景要求:即便 DBA 擁有表權限,也無法讀取特定列的明文。DB2 提供內置 SQL 加密函數,應用層透明集成,密鑰由業務持有,實現「數據擁有者可見、管理員不可見」。

核心加密函數簽名

函數用途
ENCRYPT(data, password[, hint])加密,返回 FOR BIT DATA 二進制串
DECRYPT_CHAR(encrypted, password)解密返回字符串
GETHINT(encrypted)提取加密時存入的密碼提示
SET ENCRYPTION PASSWORD = 'pwd'會話級設置默認密碼,避免重複傳遞

算法:RC2 分組密鑰 128-bit,密鑰由密碼經消息摘要派生。加密密碼與 DB2 認證體系完全無關。

三種典型加密模式

1. 列級加密(同一密鑰)

適合全表統一保護,配合視圖實現透明解密:

CREATE TABLE emp (ssn VARCHAR(124) FOR BIT DATA);
SET ENCRYPTION PASSWORD = 'Ben123';
INSERT INTO emp (ssn) VALUES (ENCRYPT('289-46-8832'));
INSERT INTO emp (ssn) VALUES (ENCRYPT('222-46-1904'));

-- 視圖自動解密
CREATE VIEW clear_ssn (ssn) AS SELECT DECRYPT_CHAR(ssn) FROM emp;
-- 應用只需 SET ENCRYPTION PASSWORD 後查視圖
SET ENCRYPTION PASSWORD = 'Ben123';
SELECT ssn FROM clear_ssn;

2. 行/單元格級加密(每行不同密鑰)

典型場景:Web 用戶各自密碼加密自己的信用卡號。

-- 插入:用戶密碼 :userpswd 加密信用卡 :cardnum
INSERT INTO customer (ccn, name) VALUES (ENCRYPT(:cardnum, :userpswd), :custname);

-- 查詢:用戶再次輸入密碼解密
SELECT DECRYPT_CHAR(ccn, :userpswd) FROM customer WHERE name = :custname;

-- 攜帶提示
INSERT INTO customer (ccn, name) VALUES (ENCRYPT(:cardnum, :userpswd, :pswdhint), :custname);
SELECT GETHINT(ccn) INTO :pswdhint FROM customer WHERE name = :custname; -- 返回 'Ski Holiday'

3. 非字符類型加密(時間戳、數值)

通過 CAST 強制轉字符串後加密:

CREATE TABLE etemp (c1 VARCHAR(124) FOR BIT DATA);
SET ENCRYPTION PASSWORD 'next passWord';

-- TIMESTAMP
INSERT INTO etemp VALUES ENCRYPT(CHAR(CURRENT TIMESTAMP));
SELECT TIMESTAMP(DECRYPT_CHAR(c1)) FROM etemp;

-- DOUBLE
INSERT INTO etemp VALUES ENCRYPT(CHAR(1.11111002E5));
SELECT DOUBLE(DECRYPT_CHAR(c1)) FROM etemp;

性能與設計考量

  • 加密開銷:CPU 增長明顯,僅對真正敏感列加密(SSN、信用卡、病歷號等),布爾值、狀態碼等低敏感度列不加密。
  • 索引失效:加密列無法建立有效 B-Tree 索引(密文無序),如需檢索需在應用層維护映射表或使用功能性索引(DB2 11.5+ 支持)。
  • 存儲膨脹:VARCHAR(n) FOR BIT DATA 需預留足夠長度:加密長度 ≈ 原長度 + 8 字節開銷 + 填充對齊,建議按 原長度 * 2 + 20 估算。
  • 密鑰管理:會話級 SET ENCRYPTION PASSWORD 適合列級;行級必須在應用層安全傳遞並管理用戶密鑰,防止密鑰洩露導致數據永久不可解密。
  • 備份/複製:加密數據備份即密文備份,異地恢復無需額外密鑰文件,簡化運維。

最佳實踐清單

  1. 識別敏感列 → 定義 VARCHAR FOR BIT DATA 並預留長度。
  2. 選擇加密模式:全表統一 → 列級 + 視圖 + 會話密碼;用戶隔離 → 行級 + 應用層密鑰管理。
  3. 嵌入提示 (hint) 降低用戶忘記密碼風險。
  4. 非字符類型統一 CAST → CHAR → ENCRYPT / DECRYPT_CHAR → CAST 模式。
  5. 壓測驗證 CPU/IO 影響,評估索引替代方案。
  6. 文檔化密鑰生命週期:生成、輪換、銷毀、應急恢復流程。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved