EnterpriseDB之EDBWrap

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》


你可能感兴趣的:(加密,wrap,EnterpriseDB)