wrap 將純文本 PL/SQL 源碼轉換為不可逆的混淆二進位格式(.plb),資料庫載入後僅儲存混淆碼,ALL_SOURCE、DBA_SOURCE 僅顯示 WRAPPED 關鍵字,原始邏輯隱藏。
# Windows CMD
SET NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
# 或
SET NLS_LANG=AMERICAN_AMERICA.US7ASCII
# Linux/Unix
export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
錯誤的 NLS_LANG 會導致中文註釋亂碼甚至加密失敗。
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
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
proc_test.plb)CREATE OR REPLACE PROCEDURE test_encrypt WRAPPED
a000000
354
... (大量十六進位混淆碼) ...
/
-- 原始邏輯完全不可讀
SQL> @proc_test.plb
Procedure created.
SQL> EXEC test_encrypt(100);
輸入參數: 100
PL/SQL procedure successfully completed.
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)。 |
PLSQL_CODE_TYPE=NATIVE + PLSQL_NATIVE_LIBRARY_DIR,生成共享庫,逆向更難(但部署複雜)。wrap 步驟,自動化產出 .plb 部署包。