EnterpriseDB服务器版(又名 PPAS(Postgres plus advanced server)有兼容oracle wrap功能如下:
EDB Wrap用于保护专有源代码和程序(包括函数,存储过程,触发器和包)不受到未经授权的查看。
加密后的源代码和程序不能进行反向操作或者跟踪调试。
使用方法:
edbwrap.exe [OPTION]...
Options:
-i, [--]iname=INPUT_FILE input file name (required)
-o, [--]oname=OUTPUT_FILrE output file name
-q, --quiet Run quietly, no informational messages
-? --help show this help, then exit
如果没有输出文件,就生成xxx的同名文件,但后缀是.plb
使用EDBWrap加密源代码的完整步骤如下:
a. 创建源代码文件。
b. 调用EDB*Wrap对代码进行混淆处理。
c. 以导入普通文本文件的形式向服务器导入经过混淆处理的文件。
下面看个例子:
1
创建一个有存储过程list_emp定义的文件listemp.sql
linux-np3p:/opt/PostgresPlus/9.1AS/bin # touch listemp.sql
linux-np3p:/opt/PostgresPlus/9.1AS/bin # vi listemp.sql
存储过程list_emp定义如下:
CREATE OR REPLACE PROCEDURE listemp
IS
v_empno NUMBER(4);
v_ename VARCHAR2(10);
CURSOR emp_cur IS
SELECT empno, ename FROM emp ORDER BY empno;
BEGIN
OPEN emp_cur;
DBMS_OUTPUT.PUT_LINE('EMPNO ENAME');
DBMS_OUTPUT.PUT_LINE('----- -------');
LOOP
FETCH emp_cur INTO v_empno, v_ename;
EXIT WHEN emp_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_empno || ' ' || v_ename);
END LOOP;
CLOSE emp_cur;
END;
/
2
登录数据库edb,创建存储过程。
linux-np3p:/opt/PostgresPlus/9.1AS/bin # ./edb-psql -U enterprisedb edb
edb=# \i listemp.sql
CREATE PROCEDURE
3
通过检查系统表pg_proc,可以看到存储过程的源代码是以普通文本方式存放在服务器中的。
edb=# SELECT prosrc FROM pg_proc WHERE proname = 'listemp';
prosrc
------------------------------------------------------------------
+
v_empno NUMBER(4); +
v_ename VARCHAR2(10); +
CURSOR emp_cur IS +
SELECT empno, ename FROM emp ORDER BY empno; +
BEGIN +
OPEN emp_cur; +
DBMS_OUTPUT.PUT_LINE('EMPNO ENAME'); +
DBMS_OUTPUT.PUT_LINE('----- -------'); +
LOOP +
FETCH emp_cur INTO v_empno, v_ename; +
EXIT WHEN emp_cur%NOTFOUND; +
DBMS_OUTPUT.PUT_LINE(v_empno || ' ' || v_ename);+
END LOOP; +
CLOSE emp_cur; +
END
(1 row)
4
退出edb-psql,使用EDB*Wrap对普通文本形式的输入文件进行混淆处理:
edb=# \q
linux-np3p:/opt/PostgresPlus/9.1AS/bin # ./edbwrap -i listemp.sql
EDB*Wrap Utility: Release 9.1.2.2
Copyright (c) 2004-2012, EnterpriseDB Corporation. All Rights Reserved.
Using encoding UTF8 for input
Processing listemp.sql to listemp.plb
linux-np3p:/opt/PostgresPlus/9.1AS/bin # ll listemp.*
-rw-r--r-- 1 root root 433 Oct 10 23:47 listemp.plb
-rw-r--r-- 1 root root 410 Oct 10 23:43 listemp.sql
5
查看加密后的存储过程定义文件
linux-np3p:/opt/PostgresPlus/9.1AS/bin # cat listemp.plb
$__EDBwrapped__$
UTF8
d6no9EOriMTHWJxI+Bhvad2Ck2HX1wsT8Ut0VC/hqXevAalrYetvgPJFvM3i4dB0GYfz29CQbtmc
d2CWOMa7dnMTo3WZl7wBX4myrNtFm7tUrEjCiUQFBieP1+r/kRvDJkTUo3vqaqYGDbKnskOqqMjr
YHwzFQW6NmLmHindmqpZq60o7IXDIWFVK+bdB+8IgJfTmeDcxGYa/NoitPKori7xzqDjcsGlfJmh
sH3yGUQgnTuyFdN7ef1bIIaLB02eY+1c9tTPJVItLY1dz33Fak+BkO7AdBGY4ZgOKxf1yui8qSdW
bbGkQ/cMi96rpuV41jKjBRcr+iF0+ITUffZ0p9mOV93R366wPQWvAKVSx2UboTnXw07q9QUSBMw+
/bGluw==
$__EDBwrapped__$
你可能注意到在经过隐藏处理的文件中的第二行包含一个编码名称(在这个示例中,是通过UTF8进行编码的)。当你对一个文件进行混淆处理的时候,EDB*Wrap通过检查本地设置,可以推断出对输入文件的编码方式。例如当本地设置是en_US.utf8,在运行EDB*Wrap时,就会认为采用UTF8的形式对输入文件进行编码。当运行完EDB*Wrap后,一定要确认检查输出文件;如果包含在经过隐藏处理文件中的本地设置与输入文件的编码形式不匹配,那么就需要改变本地设置,重新对输入文件进行隐藏操作。
6
可以使用相同的客户端工具,以和普通文本代码一样的方式将经过混淆处理的代码导入到Postgres Plus Advance Server中:
edb=# \i listemp.plb
CREATE PROCEDURE
7
通过检查系统表pg_proc,可以看到存储过程的源代码是加密后的文本。
edb=# SELECT prosrc FROM pg_proc WHERE proname = 'listemp';
prosrc
------------------------------------------------------------------------------
+
$__EDBwrapped__$ +
SQL_ASCII +
d3y8PJLmpnQwhAfIOIZdVabRwx8p027KXZ1YpSv4WIKOMiK3x+URdvix/E+LtvrrXEyvNTGZ8cl/+
TDEWdmE83SOCAJf1lFuD67f2irXHnbOz4k/w8s8nOyXYP4wu5QMDvZuUvl4vPAfBY1GwtssQ5fRo+
YiTXgf6FRYu5HSFQrqmGSCNDPgl/vTuyngfQRnJ/ehv9qKGakF6F5zKAr0LxPtTBc/IlfDNxMoPy+
5n5oxp0QDG7H2roBNb3ZrX2RGKhKXNENF7GkHAO9CA2lgQFt888yiWlKbSEAoHjb0tJNCHuiNxcS+
SHB/ZhPcESq3PIWs4/SKv8LXlhoP/pQCjjMz/4DeO/Q= +
$__EDBwrapped__$
(1 row)
8
以调用普通文本形式代码的方式来调用经过混淆处理的代码:
edb=# exec listemp;
EMPNO ENAME
----- -------
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7844 TURNER
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER
EDB-SPL Procedure successfully completed
注意:
当使用pg_dump备份数据库的时候,经过隐藏处理的程序在备份文件中保持混淆的形式。
我们应该知道由Postgres Plus Advance Server产生的审计日志会以普通文本的形式显示出经过隐
藏处理的程序。在执行程序期间,源代码也会在SQL命令的错误消息中以普通文本形式显示。
注意:目前下面这些语句创建的对象主体不会以混淆形式在服务器中进行存储:
CREATE [OR REPLACE] TYPE type_name AS OBJECT
CREATE [OR REPLACE] TYPE type_name UNDER type_name
CREATE [OR REPLACE] TYPE BODY type_name
参加《Postgres_Plus_Advanced_Server_Oracle_Compatibility_Guide_v91》