Oracle Spatial 提供強大的空間資料儲存與查詢能力,但敏感空間資料(如軍事設施、管線網路、專利幾何)需防範未授權存取。利用 Oracle 9i Release 2 的新特性——自定義回傳物件型別函數、Java/C 外部程序,可實現從應用層到硬體層的多層次空間資料加密。本文詳細解析兩種加密方案的架構與實作要點。
SDO_GEOMETRY 型別,直接作為空間查詢的幾何欄位來源SDO_GEOMETRY 的 PL/SQL 函數SDO_GEOMETRY 並回傳-- 1. 儲存表:僅存加密 BLOB
CREATE TABLE spatial_encrypted (
id NUMBER PRIMARY KEY,
geom_enc BLOB, -- 加密後的 SDO_GEOMETRY
meta VARCHAR2(200) -- 元資料:SRID、加密演算法版本等
);
-- 2. 解密函數
CREATE OR REPLACE FUNCTION decrypt_spatial(
p_id IN NUMBER,
p_key IN VARCHAR2 -- 客戶端提供的金鑰
) RETURN SDO_GEOMETRY
AS
v_blob BLOB;
v_geom SDO_GEOMETRY;
BEGIN
SELECT geom_enc INTO v_blob FROM spatial_encrypted WHERE id = p_id;
-- 呼叫加密套件解密(略),還原為 SDO_GEOMETRY
v_geom := crypto_pkg.decrypt_to_sdo(v_blob, p_key);
RETURN v_geom;
END;
SELECT id, decrypt_spatial(id, 'client_secret_key') AS geometry
FROM spatial_encrypted
WHERE SDO_RELATE(decrypt_spatial(id, 'client_secret_key'), :window_mask) = 'TRUE';
| 優點 | 缺點 |
|---|---|
| 實作簡單,純 PL/SQL 即可完成 | 金鑰在網路傳輸與應用端記憶體暴露風險 |
| 相容性好,無需額外編譯環境 | PL/SQL 加密效能較低,不適合大量即時查詢 |
| 金鑰管理彈性,可整合應用現有體系 | 資料庫內部人員(DBA)仍可讀取 BLOB 嘗試破解 |
HASH(伺服端金鑰 || 客戶端金鑰),雙方缺一不可/* decrypt_spatial.c - 簡化示意 */
#include
#include
#include
/* 取得硬體特徵碼(平台相關,此處略) */
char* get_hardware_fingerprint() {
static char hw_id[64];
/* 讀取 CPU ID、BIOS 序號等 */
return hw_id;
}
/* 產生伺服端金鑰 */
void gen_server_key(char* out_key) {
char* hw = get_hardware_fingerprint();
SHA256(hw, strlen(hw), out_key); /* 使用 OpenSSL 或自行實作 */
}
/* OCI 外部程序進入點 */
OCIExtProcRaiseExcpWithMsg(ctx, errhp, 0, "Decryption failed");
SDO_GEOMETRY* decrypt_spatial_oci(
OCIExtProcContext* ctx,
OCILobLocator* encrypted_blob,
char* client_key,
short* client_key_ind
) {
char server_key[32], final_key[64];
gen_server_key(server_key);
sprintf(final_key, "%s%s", server_key, client_key);
SHA256(final_key, strlen(final_key), final_key);
/* 解密 BLOB 並構建 SDO_GEOMETRY 物件回傳 */
/* 需使用 OCI 操作 LOB 並填充 SDO_GEOMETRY 結構體 */
return constructed_sdo_geometry;
}
-- 1. 建立 Library
CREATE OR REPLACE LIBRARY spatial_lib AS '/u01/app/oracle/lib/decrypt_spatial.so';
-- 2. 發布 C 函數
CREATE OR REPLACE FUNCTION decrypt_spatial_c(
p_blob IN BLOB,
p_key IN VARCHAR2
) RETURN SDO_GEOMETRY
AS LANGUAGE C
NAME "decrypt_spatial_oci"
LIBRARY spatial_lib
WITH CONTEXT
PARAMETERS (
CONTEXT,
p_blob OCILobLocator,
p_blob INDICATOR SHORT,
p_key STRING,
p_key INDICATOR SHORT,
RETURN OCIOBJECT,
RETURN INDICATOR SHORT
);
| 維度 | 方案一 | 方案二 |
|---|---|---|
| 開發難度 | 低 | 高(需 C/OCI 專業) |
| 查詢延遲 | 中(PL/SQL 解密) | 低(C 原生解密) |
| 部署複雜度 | 低 | 中(需編譯部署 so/dll) |
| 安全等級 | 應用層 | 硬體綁定軍規級 |
| 金鑰輪換 | 易 | 需重新加密全庫 |
Oracle Spatial 資料加密不僅是演算法選擇,更是信任邊界的劃分。方案一適合快速交付與一般合規需求;方案二以硬體指紋為信任錨點,構建「雙方持鑰、缺一不可」的高安全架構。選型時應依資料敏感度、合規要求、團隊技術棧、運維能力綜合評估。無論何種方案,金鑰全生命週期管理永遠是成敗關鍵。