您的位置:首页 > 数据库 > Oracle

使用wrap和unwrap加密解密Oracle的PL/SQL对象(包,存储过程,函数等)代码

2016-07-15 14:42 1046 查看
使用wrap和unwrap加密解密Oracle的PL/SQL对象(包,存储过程,函数等)代码

  Oracle数据库系统自带的PL/SQL对象(包,存储过程,函数等)的代码绝大部分都是使用了wrap程序加密的。为了程序代码的保密和业务规则的保密性,我们也可以将自己写的PL/SQL对象(包,存储过程,函数等)的代码进行加密。本人做了一个示例方法步骤如下:
1、首先创建一个简单的加法计算,并返回计算结果的名为 f_test 的函数:

20:22:23 SYS@orcl*SQL> create or replace functionf_test(x in number,y number)

20:22:37   2  return varchar2 is

20:22:37   3  v_result varchar2(200);

20:22:37   4  begin

20:22:37   5    v_result := 'Theresult:'||to_char(x)||' + '||y||' = '||to_char(x+y);

20:22:37   6    return v_result;

20:22:37   7  end f_test;

20:22:41   8  /

 

Function created.

2、测试 f_test 函数加密前的调用运行状态是正常的:

20:25:29 SYS@orcl*SQL> var a number

20:25:34 SYS@orcl*SQL> var b number

20:25:36 SYS@orcl*SQL> var rs varchar2(100)

20:25:41 SYS@orcl*SQL> exec :a:=8 

 

PL/SQL procedure successfully completed.

 

Elapsed: 00:00:00.00

20:25:47 SYS@orcl*SQL> exec :b:=2 

 

PL/SQL procedure successfully completed.

 

Elapsed: 00:00:00.01

20:25:52 SYS@orcl*SQL> exec :rs:=f_test(:a,:b);

 

PL/SQL procedure successfully completed.

 

Elapsed: 00:00:00.01

20:26:09 SYS@orcl*SQL> print rs 

 

RS

------------------------

The result:8 + 2 = 10

 

20:26:16 SYS@orcl*SQL> select f_test(:a,:b) from dual;

 

F_TEST(:A,:B)

------------------------

The result:8 + 2 = 10

3、 查看未加密的 f_test 函数的源代码:

20:26:27 SYS@orcl*SQL> select text from dba_sourcewhere lower(name)='f_test';

 

TEXT

---------------------------------------------------------------------------------

function f_test(x in number,y number)

return varchar2 is

v_result varchar2(200);

begin

  v_result := 'The result:'||to_char(x)||' + '||y||'= '||to_char(x+y);

  return v_result;

end f_test;

 

7 rows selected.

 

4、使用 wrap 程序对 f_test 函数的源代码进行加密:

     4.1 将 f_test 函数的源代码保存到一个 f_test.sql 脚本文件中

     4.2 执行 wrap 命令对 f_test 函数进行加密处理:

           oracle@SLES11:~/tmp> wrapiname=f_test.sql


           PL/SQL Wrapper:Release 11.2.0.1.0- Production on Sat Jan 16 20:28:15 2016

           Copyright (c)1993, 2009, Oracle.  All rights reserved.

          Processing f_test.sql to f_test.plb 

      4.3 在正常运行的数据库的SQL提示符下执行上述生成的 f_test.plb 加密文件:

            20:26:54 SYS@orcl*SQL>@/home/oracle/tmp/f_test.plb 


 

5、查看加密后的 f_test 函数的源代码(已经加密成功了):

      20:29:10 SYS@orcl*SQL>select text from dba_source where lower(name)='f_test';

TEXT

------------------------------------------------------------------------------------

function f_test wrapped

a000000

354

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

8

bf e3

a35ncMl6L/K4H+2JqJw5pFSB6LEwgy7wAJnWfARG2sHqaKfjpNvMUqXvYTczlOBmyZeRKVAm

g2IkvJ4rRQB6xlUNpyeMexVqlus04/MYZzOHoRCf2qJZDAsqOBYyEGIynj0Dr/YxBROtGlq3

FJeTbJYYBLhdk/tIQbYZ6+RCYogor/U/9uN/njfv1OVoYET5arQ79t27I0/ZWBo5O3jCDzrS

RLstIfA=

 

 

Elapsed: 00:00:00.19

 

6、验证加密后的 f_test 函数运行是否正常:

     20:29:11 SYS@orcl*SQL> selectf_test(1,7) from dual;

 

F_TEST(1,7)

-------------------------------------------------------

The result:1 + 7 = 8

 

Elapsed: 00:00:00.01

 

到此,函数加密的过程已成功完成,接下来利用unwrap工具对加密了的 f_test 函数代码进行解密:

如果使用创建Java对象进行lz解压缩方式进行解密的过程进行解密将会很烦琐,所以使用现成的工具最为方便,据说这一个阿里巴巴员工写的解密工具,叫FyUnwrap。

1、这个工具需要连接到需要解密代码的数据库,先使用 lsnrctl start 命令启动数据库监听(不连接数据库也可以,复制加密的源代码到 FyUnwrap 工具的 Wrapped Text 输入框,只不过连接数据库后操作方便一点,而且连接后,会列出数据库的所有对象列表,点击即可以进行解密)。

 

2、找到之前加密的 f_test 函数,然后点击 "Unwrap" 按钮,即可进行解密,如下图:

 



至此,PL/SQL对象代码的加解密过程就这么完成了~~~~~ 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: