對「新表新欄」啟用 TDE 極簡單,但對「既有百萬列資料的敏感欄位」加密,涉及索引限制、效能衝擊、停機時間、未加密虛副本殘留、金鑰輪換預案、查詢計劃變更等複雜議題。本文以真實諮詢案例 (百萬筆交易表加密信用卡號) 為藍本,系統記錄完整評估與實施流程。
| 檢查項目 | 限制規則 | 案例狀況 | 決策 |
|---|---|---|---|
| Bitmap Index | ❌ 禁止加密 | 無 | 無影響 |
| B-tree Index | ✅ 允許,但 必須指定 NO SALT | 目標欄位有多個 B-tree Index | 加密指定 ENCRYPT NO SALT |
| Foreign Key | ❌ 禁止加密 (各表獨立 Table Key) | 目標欄位無 FK | 無影響 |
| 索引實用性 | 監控 V$OBJECT_USAGE | 索引正在被使用 | 保留索引,加密後重建 |
-- 1. 建立測試表、索引、載入 50 萬筆模擬資料 (明文)
-- 2. 計時載入相同資料 (明文) → Baseline: 56.14 秒
-- 3. ALTER TABLE ... MODIFY (col ENCRYPT NO SALT)
-- 4. 清空表、重新載入相同資料 (加密) → Encrypted: 76.31 秒
-- 5. 開銷 = (76.31-56.14)/56.14 ≈ 36% (沙箱環境)
-- 6. 生產環境實測約 11% (硬體差異、併發、快取等因素)
關鍵洞見:務必在與生產相同硬體/資料量的沙箱測試,筆記本測試 (5 分鐘) 嚴重低估生產 (70 分鐘) 開銷。
| 策略 | 加密耗時 | 重建索引耗時 | 總計 | 備註 |
|---|---|---|---|---|
| 保留索引直接加密 | 70 分鐘 | — | 70 分鐘 | 維護窗口 2 小時險峻 |
| 刪索引 → 加密 → 重建索引 (PARALLEL 2 NOLOGGING) | 20 分鐘 | 3 秒 | ~20.5 分鐘 | ✅ 滿足維護窗口 |
-- 1. 刪除目標欄位相關索引
DROP INDEX transactions_ndx1;
-- 2. 確保欄位為明文 (若已加密先解密)
ALTER TABLE transactions MODIFY (credit_card DECRYPT);
-- 3. 載入最新資料 (或確認現有資料為明文)
-- 4. 加密欄位 (無索引開銷)
ALTER TABLE transactions MODIFY (credit_card ENCRYPT NO SALT);
-- 5. 重建索引 (平行、無日誌)
CREATE INDEX transactions_ndx1 ON transactions(credit_card)
TABLESPACE indx_002 PARALLEL 2 NOLOGGING;
-- 6. 收集統計資訊
EXEC DBMS_STATS.GATHER_TABLE_STATS('APP_001', 'TRANSACTIONS');
Oracle 加密時將新密文寫入新區塊,舊明文區塊僅標記為可重用,**實體明文殘留於磁碟**。合規審計要求立即銷毀。
DATA_002, INDX_002。ALTER TABLE ... MOVE TABLESPACE data_002、ALTER INDEX ... REBUILD TABLESPACE indx_002 腳本 (含所有受影響 Segment)。DATA_001, INDX_001 無殘留 Segment、無用戶預設指向。shred -n 200 -z -u /path/to/datafile.dbf (Linux/Unix)。Windows 環境可用sdelete(Sysinternals)、cipher /w或專業銷毀工具。
| 層級 | 操作 | 耗時/影響 | 合規接受度 |
|---|---|---|---|
| Master Key (Wallet) | ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY "new_pwd"; | 重新加密所有 Table Key,極耗時 (需停機窗口) | PCI DSS 審計員通常接受 (不涉及資料層重加密) |
| Table Key (Column) | 同加密流程:刪索引 → ALTER TABLE ... REKEY → 重建索引 | 單表級,可控 | 高敏感場景需求 |
建議:平時僅輪換 Master Key (滿足 PCI);極高敏感 (如國安) 才做 Table Key Rekey,並配合虛副本清除腳本。
WHERE credit_card = 3485458104610650
-- Plan: INDEX RANGE SCAN (加密前後一致)
WHERE credit_card BETWEEN 3499990000000000 AND 3499999999999999
-- 明文: INDEX RANGE SCAN
-- 加密: TABLE ACCESS FULL (Filter: INTERNAL_FUNCTION)
-- 原因: 加密破壞順序性,B-tree 範圍掃描無意義
EXPLAIN PLAN / AUTOTRACE。INDEX/LEADING)、統計資訊調整、或應用層改寫 (範圍查詢改等值+應用層過濾)。案例中發現某關鍵報表查詢計劃變更導致效能劣化,若未預先測試將造成生產事故。
ALTER TABLE ... MODIFY (col DECRYPT) + 索引重建,測試回滾耗時。TDE 為靜態資料加密提供了強大原生能力,但「既有資料加密」本質上是一次結構變更工程。系統化評估、沙箱實證、停機優化、合規清除、風險預案八大支柱缺一不可。**切記:文檔說明僅為參考,沙箱實測才是真理。**