程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle 存儲過程加密之wrap工具

Oracle 存儲過程加密之wrap工具

編輯:Oracle教程

Oracle 存儲過程加密之wrap工具


《Oracle存儲過程加密之wrap工具》

定場詩

道德三皇五帝,功名夏侯商周,五霸七雄鬧春秋,頃刻興亡過手,

青石幾行名姓,北邙無數荒丘,前人播種後人收,說甚龍爭虎斗。

引言:平時大家在做項目的時候,經常會遇到把Oracle存儲過程帶到項目現場來測試系統。這時如果想對自己的存儲過程進行保密,不使別人看到源代碼,就可以對已有的存儲過程進行加密保護。顧名思義,就是對Oracle存儲過程源碼的加密。當然不是什麼時候都需要的,當有的項目對安全性要求比較高的時候可以采用,下面我就用案例來介紹這種加密方式和實驗結果。

實驗環境

操作系統版本

Red Hat Enterprise Linux Server release 6.5 (Santiago)

數據庫版本

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

數據庫實例名

shdb

wrap路徑

Oracle的oracle_home/bin目錄下有wrap命令.

/opt/oracle/product/11.2.0/db_1/bin/wrap

實驗開始

1.創建一個sql文件,在oracle用戶家目錄下創建

[oracle@zxt28 ~]$ vim leonarding.sql

create or replace procedure leo(i in number)

as

begin

dbms_output.put_line('input parameter: '||to_char(i));

end;

保存&退出

[oracle@zxt28 ~]$ ll

total 3664228

drwxr-xr-x 7 oracle oinstall 4096 Aug 27 2013 database

drwxr-xr-x 2 oracle oinstall 4096 Jan 7 15:46 Desktop

-rw-r--r-- 1 oracle oinstall 128 Jan 14 16:49leonarding.sql已經生成

-rwxr-xr-x 1 root root 1395582860 Oct 17 2013 p13390677_linux-x86-64_11gR2040_database_1of2.zip

-rwxr-xr-x 1 root root 1151304589 Oct 17 2013 p13390677_linux-x86-64_11gR2040_database_2of2.zip

-rwxr-xr-x 1 root root 1205251894 Oct 16 2013 p13390677_linux-x86-64_11gR2040_grid.zip

2.Wrap方式加密

用法:

wrap的用法還是比較簡單的,一個命令就可以實現加密,以下是命令的格式

wrap iname=input_file [ oname=output_file ]

iname:指定的是源文件

oname:指定的是轉換後加密文件,oname選項可以省略如果省略wrap命令會自動生成文件名一模一樣的加密文件,當然你也可以指定自己命名方式,如下所示

[oracle@zxt28 ~]$ wrap iname=leonarding.sql

PL/SQL Wrapper: Release 11.2.0.4.0- 64bit Production on Thu Jan 14 16:57:46 2016

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

Processing leonarding.sql to leonarding.plb自動生成文件名一模一樣的加密文件

[oracle@zxt28 ~]$ ll

total 3664232

drwxr-xr-x 7 oracle oinstall 4096 Aug 27 2013 database

drwxr-xr-x 2 oracle oinstall 4096 Jan 7 15:46 Desktop

-rw-r--r-- 1 oracle oinstall 322 Jan 14 16:57leonarding.plb

-rw-r--r-- 1 oracle oinstall 128 Jan 14 16:49leonarding.sql

此時文件leonarding.plb的內容就是加密狀態,如下所示

[oracle@zxt28 ~]$ vim leonarding.plb

create or replace procedure leo wrapped

a000000

354

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

7

6f b6

nkxs9EzOsgeU6oDhPIYrMqr6O5cwg5nnm7+fMr2ywFyFodexpcOl0l6lmYEywLIlw4/AdCuP

wMAyW55SPqmpbbcguDSqEVpnEeMcL8b4MJK+J00Xi5SJpxaOFG9si+inGm+ko88RnCMuLuOq

NAMHC8hAsOjoDeGcCk+ZyF0G4Kam2x0svw==

自己指定加密文件命名

[oracle@zxt28 ~]$ rm leonarding.plb

[oracle@zxt28 ~]$ wrap iname=leonarding.sql oname=leo.plb

PL/SQL Wrapper: Release 11.2.0.4.0- 64bit Production on Thu Jan 14 16:59:58 2016

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

Processingleonarding.sql to leo.plb

[oracle@zxt28 ~]$ ll

total 3664232

drwxr-xr-x 7 oracle oinstall 4096 Aug 27 2013 database

drwxr-xr-x 2 oracle oinstall 4096 Jan 7 15:46 Desktop

-rw-r--r-- 1 oracle oinstall 128 Jan 14 16:49leonarding.sql

-rw-r--r-- 1 oracle oinstall 322 Jan 14 16:59leo.plb

它默認輸出是源文件名稱加上plb後綴,如果你要自己指定後綴名的話,也可以這樣寫,wrap iname=leonarding.sql oname=leo.out,當然只要加密之後的文件能被Oracle正確解析就好了。linux是沒有擴展名概念的。

notes:如果你拿一個已經加密過的sql文件,再次去用命令加密的話,得到的文件實際上和原來的是一樣的,自己可以嘗試下。

3.編譯加密後的leo.plb存儲過程

[oracle@zxt28 ~]$ sqlplus shdb/shdb 登錄數據庫

SQL*Plus: Release 11.2.0.4.0 Production on Thu Jan 14 17:24:18 2016

Copyright (c) 1982, 2013, Oracle. All rights reserved.

Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SHDB@shdb> @/home/oracle/leo.plb編譯存儲過程

Procedure created.

4.運行存儲過程leo

SHDB@shdb> set serveroutput on;

SHDB@shdb> exec leo(100);

input parameter: 100

PL/SQL procedure successfully completed.

SHDB@shdb> exec leo(200);

input parameter: 200

PL/SQL procedure successfully completed.

PL/SQL Developer中也是加密狀態,只能看到存儲過程名稱,看不到SQL語句\

 

我們從數據字典中看看,也是看不到內容的對不!因此現在我們就可以大大方方的使用我們的存儲過程了。避免了信息丟失風險。並且這個過程是不可逆的。

SQL> select name,text from user_source where type='PROCEDURE' and name='LEO';

NAME TEXT

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

LEO procedure leo wrapped

a000000

354

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

7

6c b2

qZ+TDoB6646qjalBmMEknutFrC4wg5nnm7+fMr2ywFyFodexpcOl0l6lmYEywLIlw4/AdCuP

wMAyW55SPqmpbbcguDSqEVpnEeMcL8b4MJK+J00Xi5SJpxaOFG9si+inGm+TPk2xd0bOxtoS

VzneMCcno8e+kr5U1bhSUn+mpn8cdlA=

PL/SQL Developer測試

SQL> exec leo(888);

input parameter: 888

PL/SQL procedure successfully completed

依舊那麼的順暢,依舊那麼的干爽!!

 

小結

到此我們完全演繹了Oracle存儲過程wrap工具加密方法,其實Oracle還提供了DBMS_DDL Subprograms加密方法,DBMS_DDL包含了加密存儲過程,函數,類型說明,類型體,包說明,包體,此子程序提供了動態生成PL/SQL單元的能力。其實內部就是一個WRAP函數和一個CREATE_WRAPPED存儲過程。再加上一個異常處理的單元MALFORMED_WRAP_INPUT。

下面我們給出一些wrap工具注意事項

wrap的限制:

1.此方法不能對存儲過程名進行加密。

2.不能加密觸發器。

4.加密的過程中,是不會檢查你的語法錯誤的,在編譯的時候會檢查。

5.他是向上兼容的,依賴於Oracle的版本,10g的可以在11g上跑,11g不可以在10g上跑,因為兩個用的不是一套加密算法

6.只能加密如下類型,不能加密匿名塊

CREATE [OR REPLACE] FUNCTION function_name

CREATE [OR REPLACE] PROCEDURE procedure_name

CREATE [OR REPLACE] PACKAGE package_name

CREATE [OR REPLACE] PACKAGE BODY package_name

CREATE [OR REPLACE] TYPE type_name AS OBJECT

CREATE [OR REPLACE] TYPE type_name UNDER type_name

CREATE [OR REPLACE] TYPE BODY type_name

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved