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

Oracle PL/SQL 程式碼加密:WRAP 工具實戰與原理

     編輯:Oracle 資料庫相關知識

什麼是 WRAP?

Oracle 提供的 PL/SQL Wrapper 工具,將可讀的 PL/SQL 原始碼轉換為不可讀的二進位格式 (.plb),保護智慧財產權。資料庫執行時會自動解碼,功能完全相同。

適用版本與限制

  • Oracle 7.3+ 皆支援
  • 加密後無法還原原始碼,**請妥善保管原始檔**
  • 僅隱藏實作細節,不提供加密安全性 (專業逆向工程可破解)
  • 某些動態 SQL、DBMS_SQL 操作可能受限

實戰步驟 (Windows 範例)

1. 設定環境變數 (重要)

SET NLS_LANG=AMERICAN_AMERICA.US7ASCII
REM 或 SET NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1

確保字元集相容,避免中文亂碼導致加密失敗。

2. 準備原始碼檔 a.sql

CREATE OR REPLACE PROCEDURE test1(i IN NUMBER) AS
BEGIN
  DBMS_OUTPUT.PUT_LINE('輸入參數是' || TO_CHAR(i));
END;
/

3. 執行加密

D:\> wrap iname=a.sql
PL/SQL Wrapper: Release 8.1.7.0.0 - Production
Copyright (c) Oracle Corporation 1993, 2000. All Rights Reserved.
Processing a.sql to a.plb

產生 a.plb (二進位) 與 a.plb 同名文字檔 (可讀包裝頭)。

4. 檢視加密後內容

CREATE OR REPLACE PROCEDURE test1 WRAPPED
0
abcd
abcd
...
(大量不可讀字元)
...

關鍵字 WRAPPED 取代了 AS/IS,本體為加密二進位。

5. 部署執行

SQL> @d:a.plb
Procedure created.

SQL> SET SERVEROUTPUT ON
SQL> EXECUTE test1(1);
輸入參數是1
PL/SQL procedure successfully completed.

6. 驗證原始碼不可見

SQL> SELECT name, text FROM all_source WHERE type='PROCEDURE' AND name='TEST1';
NAME  TEXT
----- ----------------------------------------
TEST1 CREATE OR REPLACE PROCEDURE test1 WRAPPED
TEST1 0
TEST1 abcd
... (只見包裝頭與加密資料,無原始邏輯)

進階用法

加密套件 (Package)

-- pkg_spec.sql (規格,通常不加密)
CREATE OR REPLACE PACKAGE my_pkg AS
  PROCEDURE public_proc(p_id NUMBER);
  FUNCTION public_func RETURN VARCHAR2;
END my_pkg;
/

-- pkg_body.sql (主體,加密)
CREATE OR REPLACE PACKAGE BODY my_pkg AS
  PROCEDURE public_proc(p_id NUMBER) IS
  BEGIN
    -- 核心邏輯
    NULL;
  END;
  
  FUNCTION public_func RETURN VARCHAR2 IS
  BEGIN
    RETURN 'secret';
  END;
END my_pkg;
/

-- 加密主體
wrap iname=pkg_body.sql

動態 SQL 中使用加密程序

-- 正常呼叫
EXEC wrapped_proc(1);

-- 動態 SQL 也可
EXECUTE IMMEDIATE 'BEGIN wrapped_proc(:1); END;' USING 1;

DBMS_DDL.WRAP / CREATE_WRAPPED (10g+)

資料庫內建套件,可在 PL/SQL 中動態加密:

DECLARE
  src  VARCHAR2(32767) := 'CREATE OR REPLACE PROCEDURE p IS BEGIN NULL; END;';
  wrapped VARCHAR2(32767);
BEGIN
  wrapped := DBMS_DDL.WRAP(src);
  EXECUTE IMMEDIATE wrapped;
END;
/

最佳實踐與注意事項

  1. 版控原始碼:Git/SVN 管理 .sql,.plb 不入版控
  2. CI/CD 整合:建置流程自動執行 wrap
  3. 除錯困難:錯誤堆疊不顯示行號,建議保留未加密開發版
  4. 效能無影響:資料庫載入時一次解碼,執行效能相同
  5. 不適用場景:開源專案、需客戶端除錯、頻繁修改的腳本

替代方案

方案優點缺點
WRAP官方工具、零成本、相容性佳非強加密、無法除錯
PL/SQL Obfuscator (第三方)更強混淆、變數重命名需購買、可能相容性問題
資料庫 Vault / 加密表空間資料層面加密、合規性強企業版功能、架構複雜
原始碼交付 + 法律合約客戶可維護、透明依賴法律保護
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved