引言:平时大家在做项目的时候,经常会遇到把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:49 leonarding.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:57 leonarding.plb -rw-r--r-- 1 oracle oinstall 128 Jan 14 16:49 leonarding.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. Processing leonarding.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:49 leonarding.sql -rw-r--r-- 1 oracle oinstall 322 Jan 14 16:59 leo.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
|