Oracle 9i+ 引入 SDO_GEOMETRY 類型與自定義函數返回對象類型特性,配合 Java/C 外部過程,為空間數據提供了原生加密能力。本文系統對比兩種方案架構。
CREATE FUNCTION ... RETURN SDO_GEOMETRYAS LANGUAGE JAVA / AS EXTERNAL LIBRARY ... LANGUAGE CAES_Encrypt(geom, K_app) → 存 BLOBCREATE FUNCTION decrypt_geom(p_blob BLOB, p_key VARCHAR2) RETURN SDO_GEOMETRY AS LANGUAGE JAVA ...SELECT decrypt_geom(geom_blob, :app_key) FROM spatial_tbl| 優點 | 缺點 |
|---|---|
| 開發簡單 (純 Java SP) | 密鑰在網絡/內存傳輸暴露 |
| 跨平台部署易 | DBA 可攔截 SQL 獲取密鑰 |
| 性能尚可 | 備份文件離線破解風險 |
K_session = KDF( H(Server_Hardware_ID) || K_Client )
K_srv (不可導出)K_cli 或從 HSM 獲取K_srv
3. 接收 K_cli 參數
4. KDF 組合 K_session
5. 解密 BLOB → 構造 SDO_GEOMETRY (需 OCIObjectNew/SetAttr 等)
6. 返回對象句柄
gcc -shared -o spatial_crypto.so spatial_crypto.c -I$ORACLE_HOME/rdbms/public -L$ORACLE_HOME/lib -lclntshlistener.ora (SID_LIST 增加 PROGRAM=extproc)、tnsnames.ora (HS=OK)CREATE LIBRARY spatial_crypto_lib AS '$ORACLE_HOME/lib/spatial_crypto.so';CREATE OR REPLACE FUNCTION decrypt_geom_adv(p_blob BLOB, p_cli_key VARCHAR2)
RETURN SDO_GEOMETRY
AS EXTERNAL
LIBRARY spatial_crypto_lib
NAME "decrypt_geom_adv"
LANGUAGE C
PARAMETERS (p_blob OCILOBLOCATOR, p_cli_key STRING, RETURN OCIOBJECT);
| 威脅 | 方案一 | 方案二 |
|---|---|---|
| 備份盜竊離線破解 | 可嘗試暴力破解 K_app | 無硬件指紋無法構造 K_session |
| DBA 惡意查詢 | 可獲取 SQL 綁定變量中的密鑰 | 無法在數據庫層面構造 K_srv |
| 客戶端內存掃描 | 獲取 K_app 即解密所有 | 需同時竊取服務器硬件指紋 |
| 數據文件遷移他機 | 可直接掛載查詢 | 硬件不匹配,解密失敗 |