首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 預存程式碼加密:Wrap Utility 實戰與安全性評估

     編輯:Oracle 資料庫基礎

工具介紹

wrap 是 Oracle 官方提供的 PL/SQL 原始碼混淆工具(非加密),將可讀文本轉為二進制格式,隱藏實作邏輯,保護智慧財產權。支援版本:Oracle 7.3+。

操作流程實戰

1. 環境準備

# 設定字元集(避免中文亂碼)
export NLS_LANG=AMERICAN_AMERICA.UTF8
# 或 Windows
set NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1

2. 撰寫原始碼檔 (source.sql)

CREATE OR REPLACE PROCEDURE test_encrypt (p_id IN NUMBER) AS
BEGIN
    DBMS_OUTPUT.PUT_LINE('Input parameter: ' || TO_CHAR(p_id));
END;
/
SHOW ERRORS

3. 執行 Wrap 混淆

$ wrap iname=source.sql oname=source.plb
PL/SQL Wrapper: Release 19.0.0.0.0 - Production
Copyright (c) Oracle Corporation 1993, 2021. All rights reserved.

Processing source.sql to source.plb

參數說明:

  • iname:輸入檔(預設副檔名 .sql)
  • oname:輸出檔(預設同名 .plb)
  • 若省略 oname,輸出檔為 iname.plb

4. 檢視混淆後內容

$ cat source.plb
CREATE OR REPLACE PROCEDURE test_encrypt WRAPPED
a000000
...
[二進制混淆內容]
...
/
-- 關鍵字 WRAPPED 取代 AS/IS,原始邏輯不可讀

5. 部署執行

SQL> @source.plb
Procedure created.

SQL> SET SERVEROUTPUT ON
SQL> EXEC test_encrypt(999);
Input parameter: 999
PL/SQL procedure successfully completed.

6. 驗證原始碼隱藏

SQL> SELECT text FROM user_source WHERE name = 'TEST_ENCRYPT' AND type = 'PROCEDURE';
TEXT
--------------------------------------------------
CREATE OR REPLACE PROCEDURE test_encrypt WRAPPED
a000000
...
-- 僅見混淆頭部,無業務邏輯

支援物件類型

  • PROCEDURE / FUNCTION
  • PACKAGE SPECIFICATION / BODY
  • TYPE SPECIFICATION / BODY
  • TRIGGER
  • VIEW(10g+)

安全性評估與局限

進階:DBMS_DDL.WRAP 程式化混淆

DECLARE
    v_source CLOB := q'[
        CREATE OR REPLACE FUNCTION get_bonus(p_sal NUMBER) RETURN NUMBER AS
        BEGIN
            RETURN p_sal * 0.15;
        END;
    ]';
    v_wrapped CLOB;
BEGIN
    v_wrapped := DBMS_DDL.WRAP(v_source);
    -- v_wrapped 即為混淆後原始碼,可直接 EXECUTE IMMEDIATE 部署
    EXECUTE IMMEDIATE v_wrapped;
END;
/
-- 適用於:自動化部署管線、加密產生於運行時的動態程式碼

最佳實踐建議

  1. 分層保護:核心演算法、授權邏輯、加密金鑰管理 → Wrap;一般業務流程 → 原始碼部署。
  2. 版本管控:原始碼納入 Git 版控,僅發布 .plb 至生產環境,開發/測試環境用原始碼便於除錯。
  3. 自動化管線:CI/CD 階段自動 wrap、簽署校驗和、部署。
  4. 法律補強:Wrap 技術手段 + 授權合約法律條款,雙重保護。
  5. 12c+ 新選項:DBMS_DDL.CREATE_WRAPPED 直接建立混淆物件,無需中間檔案。

總結

wrap 是低成本、原生支援、零依賴的 PL/SQL 程式碼混淆方案。雖非軍事級加密,但能有效提高逆向工程門檻,保護商業邏輯不被隨意閱讀、複製、篡改。關鍵在於:正確設定 NLS_LANG、版本一致性管理、原始碼與混淆碼環境隔離、法律技術雙重保障。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
維度說明
本質混淆,非加密。無金鑰,演算法公開,理論上可逆向工程。
防禦等級阻擋「直接閱讀」、「簡單搜尋」、「誤改」。無法阻擋具備逆向能力的攻擊者。
版本相容混淆檔通常不跨大版本相容(10g wrap 檔可能無法在 19c 載入)。部署目標版本需重新 wrap。
除錯影響IDE 除錯器無法單步進入混淆程式碼,變數檢視受限。
動態 SQL字串拼接的動態 SQL 內容不會被混淆,敏感邏輯勿置於動態 SQL 字串中。