使用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> wrap iname=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對象代碼的加解密過程就這麼完成了~~~~~