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

DB2 內建加密函數:資料值加密完整指南

     編輯:DB2 教學

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;

效能與設計考量

  • 加密會降低 SQL 效能,但可透過索引優化精確比對/聯結查詢
  • 避免對加密欄位做範圍查詢:需全表掃描並逐行解密,極度低效
  • 不宜加密低基數值:布林值、1-10 整數等易被推測,加密意義有限
  • 主從表模式:主表 emp、從表 empProject 同以加密 SSN 聯結,索引正常運作
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved