使用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
Elapsed: 00:00:00.01
20:25:52 SYS@orcl*sql> exec :rs:=f_test(:a,:b);
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,51); font-family:Arial; font-size:14px; line-height:26px"> 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';
------------------------------------------------------------------------------------
function f_test wrapped
a000000
354
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
到此,函数加密的过程已成功完成,接下来利用unwrap工具对加密了的 f_test 函数代码进行解密:
如果使用创建Java对象进行lz解压缩方式进行解密的过程进行解密将会很烦琐,所以使用现成的工具最为方便,据说这一个阿里巴巴员工写的解密工具,叫FyUnwrap。
1、这个工具需要连接到需要解密代码的数据库,先使用 lsnrctl start 命令启动数据库监听(不连接数据库也可以,复制加密的源代码到FyUnwrap 工具的 Wrapped Text 输入框,只不过连接数据库后操作方便一点,而且连接后,会列出数据库的所有对象列表,点击即可以进行解密)。
2、找到之前加密的 f_test 函数,然后点击 "Unwrap" 按钮,即可进行解密,如下图:
原文链接:https://www.f2er.com/oracle/213577.html