GIS 資料 (客戶分布、管線網路、國防設施) 屬高價值智慧財產。Oracle Spatial (9i Release 2+) 提供 SDO_GEOMETRY 物件型別,配合可回傳自訂型別的函數、Java/C 外部程序,可建立多層次加密架構。
SDO_GEOMETRY 等自訂物件型別。[Client App] --(加密金鑰)--> [PL/SQL Function] --> [解密 BLOB → SDO_GEOMETRY] --> [Client]
SDO_GEOMETRY 序列化加密為 BLOB 存入資料表。F_DECRYPT_GEOM(p_blob BLOB, p_key VARCHAR2) RETURN SDO_GEOMETRY。SELECT F_DECRYPT_GEOM(geom_blob, :app_key) FROM spatial_table ...。Final_Key = KDF(Server_HW_Key, Client_App_Key)
// 概念程式碼片段 #include #include SDO_GEOMETRY* decrypt_geom(OCIExtProcContext* ctx, OCIBlobLocator* blob, char* client_key) { // 1. 讀取硬體特徵 → 衍生 Server Key char hw_id[256]; get_hardware_fingerprint(hw_id); // 如 CPUID, dmidecode, TPM_Quote char server_key[64]; kdf(hw_id, server_key); // 2. 結合 Client Key → Final Key char final_key[64]; kdf_combine(server_key, client_key, final_key); // 3. 解密 BLOB → 建構 SDO_GEOMETRY 物件回傳 // 需使用 OCIObjectNew, OCINumber, OCIArray 等建構 SDO_GEOMETRY 屬性 return construct_sdo_geometry(decrypted_bytes); }
註:需具備 OCI 程式設計經驗,編譯為 Shared Library (.so/.dll),於資料庫註冊 CREATE LIBRARY / CREATE FUNCTION ... AS LANGUAGE C。
Client_Key。F_ENCRYPT_GEOM(geom, client_key) → 內部同樣衍生 Final_Key 加密 → 回傳 BLOB。| 維度 | 方案一 (應用層) | 方案二 (硬體綁定) |
|---|---|---|
| 實作難度 | 低 (PL/SQL/Java) | 高 (C/OCI + 硬體介面) |
| 金鑰洩露風險 | 中 (Client 端/網路) | 極低 (Server Key 不出記憶體) |
| 資料庫被盜風險 | 高 (有金鑰即可解) | 極低 (離開特定伺服器無法解) |
| 備份/遷移影響 | 無 | 遷移伺服器需重新加密/授權 |
| 效能影響 | 低 | 中 (C 函數較快,但硬體指紋計算一次) |
Oracle Spatial 結合 9i R2 物件型別回傳與外部程序能力,提供從輕量到軍規級的空間資料加密彈性。選擇哪一層防護,取決於資料價值、威脅模型與開發資源。核心原則:金鑰不落地、解密不離庫、硬體綁定身分。