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

Oracle 10g 透明資料加密 (TDE) 完整實戰:從錢包建立到效能驗證

     編輯:Oracle 資料庫基礎

前言

Oracle 10g R2 引入透明資料加密,實現「應用零修改、存儲層加密、查詢自動解密」的資料保護。本文完整記錄 TDE 啟用流程、加密選項、索引影響、錢包管理、重啟驗證及鹽值機制,供合規性建設參考。

一、TDE 核心架構

  • Master Key (主鑰):儲於加密錢包,加密所有 Table Key。
  • Table Key (表鑰):每張表一組,加密該表所有加密欄位。
  • Encryption Wallet (ewallet.p12):PKCS#12 格式檔案,存放主鑰,需密碼開啟。
  • 透明性:SQL 語法不變,INSERT 明文 → 存儲密文;SELECT 密文 → 回傳明文。

二、啟用 TDE 步驟實戰

1. 設定 sqlnet.ora 指定錢包目錄

# $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。

2. 建立/開啟錢包並生成主鑰

CONNECT / AS SYSDBA
ALTER SYSTEM SET KEY IDENTIFIED BY "Welcome1";
  • 首次執行:建立 ewallet.p12、開啟錢包、生成主鑰。
  • 後續啟動:資料庫重啟後錢包自動關閉,需手動開啟:ALTER SYSTEM SET WALLET OPEN IDENTIFIED BY "Welcome1";

3. 建立加密資料表

CONNECT dodd/dodd123
CREATE TABLE test (
  id NUMBER,
  credit_card_number VARCHAR2(16) ENCRYPT NO SALT  -- 指定無鹽值
);

4. 測試加密/解密行為

INSERT INTO test VALUES (1, '1231243242');
INSERT INTO test VALUES (2, '33245235');
COMMIT;

SELECT * FROM test;  -- 顯示明文,因錢包開啟自動解密

5. 驗證靜態加密效果(關閉錢包/重啟資料庫)

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;                -- 正常顯示明文

三、關鍵技術細節

SALT vs NO SALT

選項行為索引支援適用場景
ENCRYPT (預設 SALT)相同明文 → 不同密文,防頻率分析❌ 不支援 B-tree 索引高敏感度、無索引查詢欄位
ENCRYPT NO SALT相同明文 → 相同密文✅ 支援等值查詢索引需建立索引的加密欄位(如信用卡號)
範圍掃描、LIKE 查詢在加密索引上均無法使用,僅支援等值 (=) 存取。

索引加密行為

TDE 會自動加密索引鍵值,等值查詢 WHERE card_id = '1025023590' 仍走索引,效能影響極小。

SYS 用戶限制

SYS schema 下的表無法加密,嘗試會報錯。業務表務必建立在非 SYS 結構下。

四、錢包管理最佳實踐

  1. 備份 ewalle.p12:異地加密備份,遺失即意味著資料永久不可解密。
  2. 密碼管理:錢包密碼與資料庫帳號密碼分離,納入密碼管理系統定期輪換。
  3. 自動開啟錢包 (11g+):ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "pwd"; 可配合啟動腳本自動化。
  4. 主鑰輪換:ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY "new_pwd"; 重新生成主鑰並重新加密所有表鑰(耗時長,需維護窗口)。

五、效能影響評估

  • CPU 開銷:加密/解密每塊 ~3-5% CPU 增長(AES-192 硬體加速下更低)。
  • 存儲膨脹:加密塊頭部增加 16-20 bytes,整體約 1-3% 空間增長。
  • 索引查詢:等值查詢無感知;全表掃描需解密每塊,略增 CPU。
  • 備份/Data Pump:EXPDP 導出為明文(需 ENCRYPTION=ALL 加密導出檔)。

六、常見錯誤與解決

錯誤原因解決
ORA-28368sqlnet.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 配合索引、錢包備份與自動開啟機制。落地時務必進行完整效能基線測試與災難恢復演練(含錢包遺失情境)。

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