前段时间面试问到了package加密后如何解密。回来搜索了下:
一般用wrap这个工具实现这个功能。总得来说,Oracle加密的原理就是先对源码进行lz压缩lzstr,然后对压缩数据进行SHA-1运算得到40位的加密串shstr,然后将加密串与压缩串拼接得到shstr+lzstr,然后对拼接后的字符串进行Oracle双字符转换(转换表)。最后将转换后的字符串进行base64编码,最终得到wrap的加密串。
使用步骤如下:
(1)将我们要加密的sql 语句保存到一个sql文本里。
(2)用wrap 进行处理,指定输入的sql,即我们第一步的问题,然后指定输出的路径和文件名,默认扩展名是plb。
(3)执行我们第二部进过wrap 处理的sql,即plb文件,创建我们的对象.
SQL> create or replace function f_yu
2 (
3 n int
4 ) return string
5 is
6 begin
7 if n = 1 then
8 return 'one';
9 else
10 return 'please input 1';
11 end if;
12 end;
13 /
函数已创建。
SQL> select f_yu(1) from dual;
F_YU(1)
------------------------------
one
SQL> host dir
驱动器 D 中的卷是 本地磁盘
卷的序列号是 204B-59A8
D:\oracle\oracleScript 的目录
2013-03-22 15:49 <DIR> .
2013-03-22 15:49 <DIR> ..
2013-01-12 18:42 <DIR> backup
2013-03-22 15:47 190 f_yu.sql
D:\oracle\oracleScript>wrap iname=f_yu.sql
PL/SQL Wrapper: Release 10.2.0.1.0- Production on 星期五 3月 22 15:52:25 2013
Copyright (c) 1993, 2004, Oracle. All rights reserved.
Processing f_yu.sql to f_yu.plb
f_yu.plb中的内容:
create or replace function f_yu wrapped
a000000
354
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
8
a1 be
n3yDKeu6pb1+OQR5N/L06J7ZLWwwg8eZgcfLCNL+XlptZFZDJY8JpuEkL+4pHxVjJi9dq9Or
XbAvdtNdKcH/Q4jY3UNd/LkpWyuLKTnD3gpwTS8G7p7z+x1Nb4HkNMMy9ktLCq5L1ejPNdwn
4FLl5smHNd70rKhZJk+ZUHH20cp512MojnCmpomvFOc=
/
SQL> @f_yu.plb
警告: 创建的函数带有编译错误。
-- 查看源码,已经加密了
SQL> select text from dba_source where name='F_YU';
TEXT
--------------------------------------------------------------------------------
function f_yu wrapped
a000000
354
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
TEXT
--------------------------------------------------------------------------------
abcd
abcd
abcd
abcd
abcd
abcd
abcd
8
a1 be
n3yDKeu6pb1+OQR5N/L06J7ZLWwwg8eZgcfLCNL+XlptZFZDJY8JpuEkL+4pHxVjJi9dq9Or
XbAvdtNdKcH/Q4jY3UNd/LkpWyuLKTnD3gpwTS8G7p7z+x1Nb4HkNMMy9ktLCq5L1ejPNdwn
TEXT
--------------------------------------------------------------------------------
4FLl5smHNd70rKhZJk+ZUHH20cp512MojnCmpomvFOc=