Oracle Spatial (9i+) 支持自定義函數返回 SDO_GEOMETRY 類型,配合 Java/C 外部過程,可構建靈活的空間數據加密體系。本文對比「簡單加密」與「硬件綁定高級加密」兩種方案架構。
K_app 加密 SDO_GEOMETRY → 存儲為 BLOB/VARCHAR2。CREATE OR REPLACE FUNCTION decrypt_geom(
p_encrypted_blob BLOB,
p_key VARCHAR2 -- 應用傳入密鑰
) RETURN SDO_GEOMETRY
AS LANGUAGE JAVA
NAME 'SpatialCrypto.decrypt(oracle.sql.BLOB, java.lang.String) return oracle.spatial.geometry.JGeometry';
SELECT decrypt_geom(geom_blob, :app_key) FROM spatial_table;最終解密密鑰 = f(服務端硬件碼, 客戶端動態密鑰),雙方缺一不可。
K_srv = H(hardware_id)K_cliK_session = KDF(K_srv || K_cli)SDO_GEOMETRY 返回CREATE OR REPLACE FUNCTION decrypt_geom_adv(
p_encrypted_blob BLOB,
p_client_key VARCHAR2
) RETURN SDO_GEOMETRY
AS EXTERNAL
LIBRARY spatial_crypto_lib
NAME "decrypt_geom_adv"
LANGUAGE C
PARAMETERS (
p_encrypted_blob OCILOBLOCATOR,
p_client_key STRING,
RETURN OCIOBJECT -- SDO_GEOMETRY
);
K_cli (或從 HSM/密碼管理器獲取),每次查詢傳入。| 攻擊向量 | 簡單加密 | 高級加密 |
|---|---|---|
| 數據庫備份盜竊 | 可離線暴力破解密鑰 | 無服務端硬件碼無法解密 |
| DBA 惡意查詢 | 可攔截 SQL 獲取密鑰 | 無硬件碼無法構造會話密鑰 |
| 客戶端內存掃描 | 獲取密鑰即可解密所有數據 | 需同時竊取服務器硬件指紋 |
| 數據文件拷貝到他機 | 可直接掛載查詢 | 硬件碼不匹配,解密失敗 |
| 維度 | 簡單加密 | 高級加密 |
|---|---|---|
| 開發語言 | Java (JDBC/OJVM) | C/C++ (OCI/外部過程) |
| 部署複雜度 | 低 (loadjava 即可) | 高 (編譯共享庫、配置 listener.ora/extproc) |
| 性能 | 中 (JVM 開銷) | 高 (原生代碼、無 GC) |
| 可移植性 | 跨平台 | 平台相關 (需各 OS 編譯 so/dll) |