首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle PL/SQL 程式碼加密:WRAP 工具實戰與安全性評估

     編輯:Oracle 資料庫相關知識

WRAP 工具原理

wrap 將純文本 PL/SQL 源碼轉換為不可逆的混淆二進位格式(.plb),資料庫載入後僅儲存混淆碼,ALL_SOURCE、DBA_SOURCE 僅顯示 WRAPPED 關鍵字,原始邏輯隱藏。

完整操作流程

1. 環境準備(關鍵:NLS_LANG 必須相容)

# Windows CMD
SET NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
# 或
SET NLS_LANG=AMERICAN_AMERICA.US7ASCII

# Linux/Unix
export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1

錯誤的 NLS_LANG 會導致中文註釋亂碼甚至加密失敗。

2. 撰寫源碼檔 (proc_test.sql)

CREATE OR REPLACE PROCEDURE test_encrypt(p_id IN NUMBER) AS
BEGIN
    DBMS_OUTPUT.PUT_LINE('輸入參數: ' || TO_CHAR(p_id));
    -- 業務邏輯...
END;
/
SHOW ERRORS

3. 執行加密

wrap iname=proc_test.sql oname=proc_test.plb
# 輸出:
# PL/SQL Wrapper: Release 11.2.0.4.0 - Production
# Processing proc_test.sql to proc_test.plb

4. 檢視加密產物 (proc_test.plb)

CREATE OR REPLACE PROCEDURE test_encrypt WRAPPED
a000000
354
... (大量十六進位混淆碼) ...
/
-- 原始邏輯完全不可讀

5. 部署執行

SQL> @proc_test.plb
Procedure created.

SQL> EXEC test_encrypt(100);
輸入參數: 100
PL/SQL procedure successfully completed.

6. 驗證源碼隱藏

SQL> SELECT name, text FROM all_source WHERE type='PROCEDURE' AND name='TEST_ENCRYPT';
NAME          TEXT
------------- --------------------
TEST_ENCRYPT  WRAPPED
-- 僅顯示 WRAPPED,無原始碼

安全性評估與局限

維度說明
逆向難度極高。無官方解密工具,第三方工具僅能部分還原結構,核心邏輯(算法、金鑰、業務規則)難以提取。
運行時保護無。記憶體中仍有解析樹,具備 DBA 權限可透過 DEBUG/Trace 手段分析運行行為。
版本相容向上相容:低版本 wrap 產物可在高版本載入。向下不相容。
動態 SQL 影響字串拼接的動態 SQL 內容不會被加密,敏感邏輯勿放入動態字串。
審計/合規滿足「源碼不落地」合規要求,但無法替代資料庫加密(TDE/DBMS_CRYPTO)。

進階替代方案

  • DBMS_DDL.WRAP / CREATE_WRAPPED:12c+ 內建 PL/SQL API,可在程式中動態加密部署。
  • PL/Scope + PL/SQL Hierarchical Profiler:開發期靜態分析替代源碼審閱。
  • Oracle Database Vault / Redaction:資料層面存取控制與遮罩,源碼保護之外的纵深防禦。
  • 編譯為原生代碼:PLSQL_CODE_TYPE=NATIVE + PLSQL_NATIVE_LIBRARY_DIR,生成共享庫,逆向更難(但部署複雜)。

最佳實踐建議

  1. 僅加密核心算法/授權邏輯/加密金鑰相關包體,通用工具包保持開源便於維護。
  2. 源碼納入版本控制,加密產物視為建構產物,不入庫。
  3. CI/CD 流水線整合 wrap 步驟,自動化產出 .plb 部署包。
  4. 定期評估第三方解密工具威脅,關鍵邏輯考慮遷移至 Java/.NET 中間層或 Oracle 外部過程。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved