首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle DBMS_CRYPTO 實現敏感欄位加密:DES_CBC_PKCS5 完整範例

     編輯:Oracle 資料庫相關知識

資料庫層面欄位加密是滿足 GDPR、PCI-DSS、個資法合規的關鍵手段。Oracle 11g+ 提供 DBMS_CRYPTO 套件支援 DES/3DES/AES 等演算法,本文提供可直接部署的加密/解密函數、建表測試、效能考量與金鑰管理建議。

環境確認

SQL> SELECT * FROM v$version;
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

建立加密函數

CREATE OR REPLACE FUNCTION f_encrypt_number(p_plain IN VARCHAR2) RETURN RAW IS
  l_plain_raw  RAW(128) := UTL_I18N.STRING_TO_RAW(p_plain, 'AL32UTF8');
  l_key_num    NUMBER(32) := 32432432343243279898;  -- 生產環境勿硬編碼!
  l_key_raw    RAW(128) := UTL_RAW.CAST_FROM_NUMBER(l_key_num);
  l_encrypted  RAW(128);
BEGIN
  l_encrypted := DBMS_CRYPTO.ENCRYPT(
    src => l_plain_raw,
    typ => DBMS_CRYPTO.DES_CBC_PKCS5,
    key => l_key_raw
  );
  RETURN l_encrypted;
END;
/

建立解密函數

CREATE OR REPLACE FUNCTION f_decrypt_number(p_cipher IN RAW) RETURN VARCHAR2 IS
  l_decrypted_raw RAW(48);
  l_key_num       NUMBER(32) := 32432432343243279898;
  l_key_raw       RAW(128) := UTL_RAW.CAST_FROM_NUMBER(l_key_num);
BEGIN
  l_decrypted_raw := DBMS_CRYPTO.DECRYPT(
    src => p_cipher,
    typ => DBMS_CRYPTO.DES_CBC_PKCS5,
    key => l_key_raw
  );
  RETURN UTL_I18N.RAW_TO_CHAR(l_decrypted_raw, 'AL32UTF8');
END;
/

測試驗證

-- 加密測試
SELECT f_encrypt_number('wwww.111cn.net') FROM dual;
-- 003CB89CB77F6644C93AE2CF7810B0E3E3B10B8C60B54058

-- 解密測試
SELECT f_decrypt_number(HEXTORAW('003CB89CB77F6644C93AE2CF7810B0E3E3B10B8C60B54058')) FROM dual;
-- wwww.111cn.net

建表整合測試

CREATE TABLE xifenfei_crypto (
  id      NUMBER,
  name    VARCHAR2(20),
  en_name RAW(128)
);

INSERT INTO xifenfei_crypto (id, name)
SELECT object_id, object_name FROM dba_objects WHERE rownum < 10;
COMMIT;

-- 加密現有資料
UPDATE xifenfei_crypto SET en_name = f_encrypt_number(name);
COMMIT;

-- 查詢解密
SELECT id, name, f_decrypt_number(en_name) AS dec_name, en_name
FROM xifenfei_crypto;

演算法選擇指南

常數演算法金鑰長度安全性效能備註
DBMS_CRYPTO.DES_CBC_PKCS5DES56 bits低(已被破解)快僅教學/相容舊系統
DBMS_CRYPTO.DES3_CBC_PKCS53DES (TDEA)168 bits中中FIPS 相容,逐漸淘汰
DBMS_CRYPTO.AES_CBC_PKCS5AES128/192/256 bits高快(硬體加速)推薦生產環境
DBMS_CRYPTO.AES_GCMAES-GCM128/192/256 bits高(認證加密)快12c+,提供完整性驗證

生產環境部署關鍵點

  1. 金鑰不硬編碼:儲於 Oracle Wallet、Key Vault、HSM 或環境變數,函數中動態讀取。
  2. IV (Initialization Vector) 管理:CBC 模式需隨機 IV,建議每筆資料產生唯一 IV 並與密文共同儲存(如 en_name RAW(128) := iv || ciphertext)。
  3. 權限控管:GRANT EXECUTE ON f_encrypt_number TO app_user,REVOKE EXECUTE ON f_decrypt_number FROM app_user,解密權限僅限審計/特權帳號。
  4. 索引策略:加密欄位無法建立 B-tree 索引支援範圍查詢,若需精確比對可建立 FUNCTION-BASED INDEX:CREATE INDEX idx_enc_name ON t(f_encrypt_number(name))(需 Deterministic 函數,但決定性加密降低安全性)。
  5. 效能基準:AES-NI 硬體加速下,單核每秒可處理 50-100 萬次加密/解密,OLTP 關鍵路徑可接受。
  6. 備份/匯出:加密資料導出仍為密文,金鑰需同步備份並受同等保護。

透明資料加密 (TDE) 替代方案

若整張表/表空間需加密,優先使用 TDE Tablespace Encryption 或 TDE Column Encryption:

-- Tablespace 加密(11g+)
CREATE TABLESPACE secure_ts
  DATAFILE '/u01/oradata/orcl/secure01.dbf' SIZE 1G
  ENCRYPTION USING 'AES256'
  DEFAULT STORAGE (ENCRYPT);

-- Column 加密
CREATE TABLE t (
  id NUMBER,
  ssn VARCHAR2(11) ENCRYPT USING 'AES256' NO SALT
);

TDE 優勢:零應用修改、索引支援、自動金鑰輪換、與 Data Pump/RMAN/Data Guard 無縫整合。

DBMS_CRYPTO 適合「少數欄位、應用可控、需細粒度權限」場景。全表/大量欄位加密請直接上 TDE,避免重複造輪子並獲得完整合規證據鏈。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved