資料庫層面欄位加密是滿足 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_PKCS5 | DES | 56 bits | 低(已被破解) | 快 | 僅教學/相容舊系統 |
| DBMS_CRYPTO.DES3_CBC_PKCS5 | 3DES (TDEA) | 168 bits | 中 | 中 | FIPS 相容,逐漸淘汰 |
| DBMS_CRYPTO.AES_CBC_PKCS5 | AES | 128/192/256 bits | 高 | 快(硬體加速) | 推薦生產環境 |
| DBMS_CRYPTO.AES_GCM | AES-GCM | 128/192/256 bits | 高(認證加密) | 快 | 12c+,提供完整性驗證 |
en_name RAW(128) := iv || ciphertext)。GRANT EXECUTE ON f_encrypt_number TO app_user,REVOKE EXECUTE ON f_decrypt_number FROM app_user,解密權限僅限審計/特權帳號。FUNCTION-BASED INDEX:CREATE INDEX idx_enc_name ON t(f_encrypt_number(name))(需 Deterministic 函數,但決定性加密降低安全性)。若整張表/表空間需加密,優先使用 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,避免重複造輪子並獲得完整合規證據鏈。