Oracle 10g 引入 DBMS_CRYPTO 套件提供業界標準加密算法。本文展示完整落地流程:創建密鑰表、授權、封裝 ENCRYPT/DECRYPT 函數、測試插入查詢,採用 AES256 + CBC 模式 + PKCS5 填充,密鑰長度 256 位(32 字節),字符集 AL32UTF8,適合密碼、敏感字段加密存儲。
-- SYS 用戶執行
GRANT EXECUTE ON DBMS_CRYPTO TO 業務用戶;
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 或密碼管理系統,避免明文存表;定期輪換密鑰並重新加密歷史數據。
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;
/
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;
/
-- 查看密鑰(僅調試用)
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_AES256 | AES 算法,256 位密鑰(高強度) |
CHAIN_CBC | Cipher Block Chaining 模式,需 IV(隱式全零) |
PAD_PKCS5 | PKCS#5 填充,處理非 16 字節倍數數據 |
組合值:ENCRYPTION_TYPE := ENCRYPT_AES256 + CHAIN_CBC + PAD_PKCS5(等價 4353)。
KEYINFOMTBL 增加 KEY_ID、CREATED_DATE、STATUS 字段實現版本管理。DBMS_CRYPTO.ENCRYPT 的 BLOB 版本減少上下文切換。DBMS_CRYPTO 提供開箱即用的強加密能力,配合標準算法組合(AES256/CBC/PKCS5)與字符集轉換(AL32UTF8),可快速構建字段級加密方案。核心在於密鑰全生命週期管理:生成、存儲、輪換、銷毀,建議納入企業密碼管理體系統一管控。