Oracle 10g R2 引入透明資料加密,實現「應用零修改、存儲層加密、查詢自動解密」的資料保護。本文完整記錄 TDE 啟用流程、加密選項、索引影響、錢包管理、重啟驗證及鹽值機制,供合規性建設參考。
# $ORACLE_HOME/network/admin/sqlnet.ora
ENCRYPTION_WALLET_LOCATION=
(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/opt/oracle/admin/test97/wallet/)))
⚠ 目錄需預先建立且 Oracle 進程有讀寫權限。若缺少此設定,執行ALTER SYSTEM SET KEY會報ORA-28368: cannot auto-create wallet。
CONNECT / AS SYSDBA
ALTER SYSTEM SET KEY IDENTIFIED BY "Welcome1";
ewallet.p12、開啟錢包、生成主鑰。ALTER SYSTEM SET WALLET OPEN IDENTIFIED BY "Welcome1";CONNECT dodd/dodd123
CREATE TABLE test (
id NUMBER,
credit_card_number VARCHAR2(16) ENCRYPT NO SALT -- 指定無鹽值
);
INSERT INTO test VALUES (1, '1231243242');
INSERT INTO test VALUES (2, '33245235');
COMMIT;
SELECT * FROM test; -- 顯示明文,因錢包開啟自動解密
SHUTDOWN IMMEDIATE
STARTUP
-- 錢包關閉狀態
SELECT * FROM dodd.test; -- ORA-28365: wallet is not open
SELECT id FROM dodd.test; -- 非加密欄位可正常查詢
-- 開啟錢包恢復存取
CONNECT / AS SYSDBA
ALTER SYSTEM SET WALLET OPEN IDENTIFIED BY "Welcome1";
CONNECT dodd/dodd123
SELECT * FROM test; -- 正常顯示明文
| 選項 | 行為 | 索引支援 | 適用場景 |
|---|---|---|---|
| ENCRYPT (預設 SALT) | 相同明文 → 不同密文,防頻率分析 | ❌ 不支援 B-tree 索引 | 高敏感度、無索引查詢欄位 |
| ENCRYPT NO SALT | 相同明文 → 相同密文 | ✅ 支援等值查詢索引 | 需建立索引的加密欄位(如信用卡號) |
範圍掃描、LIKE 查詢在加密索引上均無法使用,僅支援等值 (=) 存取。
TDE 會自動加密索引鍵值,等值查詢 WHERE card_id = '1025023590' 仍走索引,效能影響極小。
SYS schema 下的表無法加密,嘗試會報錯。業務表務必建立在非 SYS 結構下。
ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "pwd"; 可配合啟動腳本自動化。ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY "new_pwd"; 重新生成主鑰並重新加密所有表鑰(耗時長,需維護窗口)。EXPDP 導出為明文(需 ENCRYPTION=ALL 加密導出檔)。| 錯誤 | 原因 | 解決 |
|---|---|---|
| ORA-28368 | sqlnet.ora 未設定 ENCRYPTION_WALLET_LOCATION | 設定正確目錄路徑並重啟監聽/實例 |
| ORA-28365 | 錢包未開啟 | 執行 ALTER SYSTEM SET WALLET OPEN IDENTIFIED BY "pwd" |
| ORA-28374 | 加密欄位建立索引但未指定 NO SALT | 重建欄位指定 ENCRYPT NO SALT |
| ORA-28330 | 嘗試加密 SYS 物件 | 移至非 SYS 結構 |
TDE 是滿足 PCI-DSS、GDPR、個資法等合規要求的「殺手鐧級」功能。關鍵在於:錢包目錄預設、主鑰生成、NO SALT 配合索引、錢包備份與自動開啟機制。落地時務必進行完整效能基線測試與災難恢復演練(含錢包遺失情境)。