Oracle 提供的 PL/SQL Wrapper 工具,將可讀的 PL/SQL 原始碼轉換為不可讀的二進位格式 (.plb),保護智慧財產權。資料庫執行時會自動解碼,功能完全相同。
SET NLS_LANG=AMERICAN_AMERICA.US7ASCII
REM 或 SET NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
確保字元集相容,避免中文亂碼導致加密失敗。
a.sqlCREATE OR REPLACE PROCEDURE test1(i IN NUMBER) AS
BEGIN
DBMS_OUTPUT.PUT_LINE('輸入參數是' || TO_CHAR(i));
END;
/
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 同名文字檔 (可讀包裝頭)。
CREATE OR REPLACE PROCEDURE test1 WRAPPED
0
abcd
abcd
...
(大量不可讀字元)
...
關鍵字 WRAPPED 取代了 AS/IS,本體為加密二進位。
SQL> @d:a.plb
Procedure created.
SQL> SET SERVEROUTPUT ON
SQL> EXECUTE test1(1);
輸入參數是1
PL/SQL procedure successfully completed.
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
... (只見包裝頭與加密資料,無原始邏輯)
-- 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
-- 正常呼叫
EXEC wrapped_proc(1);
-- 動態 SQL 也可
EXECUTE IMMEDIATE 'BEGIN wrapped_proc(:1); END;' USING 1;
資料庫內建套件,可在 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;
/
.sql,.plb 不入版控wrap| 方案 | 優點 | 缺點 |
|---|---|---|
| WRAP | 官方工具、零成本、相容性佳 | 非強加密、無法除錯 |
| PL/SQL Obfuscator (第三方) | 更強混淆、變數重命名 | 需購買、可能相容性問題 |
| 資料庫 Vault / 加密表空間 | 資料層面加密、合規性強 | 企業版功能、架構複雜 |
| 原始碼交付 + 法律合約 | 客戶可維護、透明 | 依賴法律保護 |