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

Oracle 10g DBMS_CRYPTO 數據加密解密實戰:AES256 + CBC + PKCS5 填充完整示例

     編輯:Oracle 資料庫基礎

Oracle 10g 引入 DBMS_CRYPTO 套件提供業界標準加密算法。本文展示完整落地流程:創建密鑰表、授權、封裝 ENCRYPT/DECRYPT 函數、測試插入查詢,採用 AES256 + CBC 模式 + PKCS5 填充,密鑰長度 256 位(32 字節),字符集 AL32UTF8,適合密碼、敏感字段加密存儲。

1. 權限授予

-- SYS 用戶執行
GRANT EXECUTE ON DBMS_CRYPTO TO 業務用戶;

2. 密鑰管理表

CREATE TABLE KEYINFOMTBL (
  KEYCODE RAW(32) NOT NULL,
  CONSTRAINT KEYINFOMTBL_P PRIMARY KEY (KEYCODE) USING INDEX
);

-- 生成隨機 256 位密鑰並寫入(僅執行一次)
INSERT INTO KEYINFOMTBL VALUES (DBMS_CRYPTO.RANDOMBYTES(32));

安全提示:生產環境應將密鑰存儲於 Oracle Wallet、HSM 或密碼管理系統,避免明文存表;定期輪換密鑰並重新加密歷史數據。

3. 加密函數

CREATE OR REPLACE FUNCTION ENCRYPT (INPUT_STRING VARCHAR2) RETURN RAW IS
  ENCRYPTED_RAW RAW(100);
  KEY_BYTES_RAW RAW(32);
  ENCRYPTION_TYPE PLS_INTEGER :=
    DBMS_CRYPTO.ENCRYPT_AES256
  + DBMS_CRYPTO.CHAIN_CBC
  + DBMS_CRYPTO.PAD_PKCS5;
BEGIN
  SELECT KEYCODE INTO KEY_BYTES_RAW FROM KEYINFOMTBL;
  ENCRYPTED_RAW := DBMS_CRYPTO.ENCRYPT(
    SRC => UTL_I18N.STRING_TO_RAW(INPUT_STRING, 'AL32UTF8'),
    TYP => ENCRYPTION_TYPE,
    KEY => KEY_BYTES_RAW
  );
  RETURN ENCRYPTED_RAW;
END;
/

4. 解密函數

CREATE OR REPLACE FUNCTION DECRYPT (INPUT_RAW RAW) RETURN VARCHAR2 IS
  OUTPUT_STRING VARCHAR2(100);
  DECRYPTED_RAW RAW(100);
  KEY_BYTES_RAW RAW(32);
  ENCRYPTION_TYPE PLS_INTEGER :=
    DBMS_CRYPTO.ENCRYPT_AES256
  + DBMS_CRYPTO.CHAIN_CBC
  + DBMS_CRYPTO.PAD_PKCS5;
BEGIN
  SELECT KEYCODE INTO KEY_BYTES_RAW FROM KEYINFOMTBL;
  DECRYPTED_RAW := DBMS_CRYPTO.DECRYPT(
    SRC => INPUT_RAW,
    TYP => ENCRYPTION_TYPE,
    KEY => KEY_BYTES_RAW
  );
  OUTPUT_STRING := UTL_I18N.RAW_TO_CHAR(DECRYPTED_RAW, 'AL32UTF8');
  RETURN OUTPUT_STRING;
END;
/

5. 測試驗證

-- 查看密鑰(僅調試用)
SELECT UTL_I18N.RAW_TO_CHAR(KEYCODE, 'AL32UTF8') FROM KEYINFOMTBL;

-- 創建測試表
CREATE TABLE TESTPW (PASSWORD RAW(200));

-- 插入加密數據
INSERT INTO TESTPW VALUES (ENCRYPT('nvgwngw383$'));
COMMIT;

-- 查看密文
SELECT UTL_I18N.RAW_TO_CHAR(PASSWORD, 'AL32UTF8') FROM TESTPW;

-- 解密查詢
SELECT DECRYPT(PASSWORD) FROM TESTPW;
-- 輸出:nvgwngw383$

算法參數解析

常量含義
ENCRYPT_AES256AES 算法,256 位密鑰(高強度)
CHAIN_CBCCipher Block Chaining 模式,需 IV(隱式全零)
PAD_PKCS5PKCS#5 填充,處理非 16 字節倍數數據

組合值:ENCRYPTION_TYPE := ENCRYPT_AES256 + CHAIN_CBC + PAD_PKCS5(等價 4353)。

進階擴展建議

  1. 支持 IV(初始化向量):CBC 模式建議每次加密生成隨機 IV,隨密文存儲,防止相同明文產生相同密文。
  2. 密鑰分級:不同敏感級別字段使用不同密鑰,配合 KEYINFOMTBL 增加 KEY_ID、CREATED_DATE、STATUS 字段實現版本管理。
  3. 性能優化:批量加密時使用 DBMS_CRYPTO.ENCRYPT 的 BLOB 版本減少上下文切換。
  4. 合規審計:記錄加密/解密調用日志,滿足等保、GDPR 審計要求。

總結

DBMS_CRYPTO 提供開箱即用的強加密能力,配合標準算法組合(AES256/CBC/PKCS5)與字符集轉換(AL32UTF8),可快速構建字段級加密方案。核心在於密鑰全生命週期管理:生成、存儲、輪換、銷毀,建議納入企業密碼管理體系統一管控。

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