DB2 Universal Database (Unix & Windows) 內建 SQL 加密函數,讓應用程式輕鬆整合資料加密。傳統資料庫透過權限控管存取,但現代需求要求連 DBA 也無法閱覽敏感欄位(如信用卡號、身分證字號)。DB2 提供應用層加密:寫入時以使用者提供密碼加密,讀取時需同一密碼解密。
| 函數 | 用途 |
|---|---|
ENCRYPT(data, password[, hint]) | 加密字串資料,可選密碼提示 |
DECRYPT_CHAR(encrypted_data, password) | 解密為字串 |
GETHINT(encrypted_data) | 取得密碼提示 |
SET ENCRYPTION PASSWORD | 設定連線層級預設加密密碼 |
演算法:RC2 區塊加密 + 128-bit 金鑰(由密碼經訊息摘要衍生)。加密密碼與 DB2 認證無關,專供資料加解密。
同一欄位所有值使用相同密碼。搭配 SET ENCRYPTION PASSWORD 專用暫存器,連線期間共用密碼。
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'));
SELECT DECRYPT_CHAR(ssn) FROM emp;
配合 View 簡化應用:
CREATE VIEW clear_ssn (ssn) AS SELECT DECRYPT_CHAR(ssn) FROM emp;
SET ENCRYPTION PASSWORD = 'Ben123';
SELECT ssn FROM clear_ssn;
同一加密欄位內不同列使用不同密碼。典型案例:Web 系統儲存客戶信用卡號,各客戶自行設定密碼。
-- 寫入
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' 等提示字串
透過 CAST 轉為 VARCHAR/CHAR 後加密:
-- TIMESTAMP
CREATE TABLE etemp (c1 VARCHAR(124) FOR BIT DATA);
SET ENCRYPTION PASSWORD = 'next password';
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;
emp、從表 empProject 同以加密 SSN 聯結,索引正常運作