使用wrap和unwrap加密解密Oracle的PL/SQL對象(包,存儲過程,函數等)代碼

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章