oracle存储过程加密

引言:平时大家在做项目的时候,经常会遇到把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用户家目录下创建

[[email protected] ~]$ vim leonarding.sql

create or replace procedure leo(i in number)

as

begin

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

end;

保存&退出

[[email protected] ~]$ 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命令会自动生成文件名一模一样的加密文件,当然你也可以指定自己命名方式,如下所示

[[email protected] ~]$ 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    自动生成文件名一模一样的加密文件

[[email protected] ~]$ 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的内容就是加密状态,如下所示

[[email protected] ~]$ 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==

自己指定加密文件命名

[[email protected] ~]$ rm leonarding.plb

[[email protected] ~]$ 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

[[email protected] ~]$ 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存储过程

[[email protected] ~]$ 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

[email protected]> @/home/oracle/leo.plb                                 编译存储过程

Procedure created.

4.运行存储过程leo

[email protected]> set serveroutput on;

[email protected]> exec leo(100);

input parameter: 100

PL/SQL procedure successfully completed.

[email protected]> 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

时间: 2024-10-14 00:43:43

oracle存储过程加密的相关文章

Oracle 存储过程加密之wrap工具

<Oracle 存储过程加密之wrap工具> 定场诗 道德三皇五帝,功名夏侯商周,五霸七雄闹春秋,顷刻兴亡过手, 青石几行名姓,北邙无数荒丘,前人播种后人收,说甚龙争虎斗. 引言:平时大家在做项目的时候,经常会遇到把Oracle存储过程带到项目现场来测试系统.这时如果想对自己的存储过程进行保密,不使别人看到源代码,就可以对已有的存储过程进行加密保护.顾名思义,就是对Oracle存储过程源码的加密.当然不是什么时候都需要的,当有的项目对安全性要求比较高的时候可以采用,下面我就用案例来介绍这种加密

oracle存储过程实例

oracle存储过程实例 分类: 数据(仓)库及处理 2010-05-03 17:15 1055人阅读 评论(2)收藏 举报 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块.但存储过程和函数不同于已经介绍过的PL/SQL程序,我们通常把PL/SQL程序称为无名块,而存储过程和函数是以命名的方式存储于数据库中的.和PL/SQL程序相比,存储过程有非常多长处,详细归纳例如以下: * 存储过程和函数以命名的数据库对象形式存储于数据库其中.存储在数据库中的长处是非

java怎样将一组对象传入Oracle存储过程

java怎样将一组对象传入Oracle存储过程.须要注意的是jar包是有要求的,假设使用不当会导致仅仅有数字能传过去,字符串传只是去.假设是Oracle11g则须要选用例如以下的jar包,F:\app\Administrator\product\11.2.0\dbhome_1\jlib\orai18n.jar. D:\program\weblogic\oracle_common\modules\oracle.jdbc_11.2.0\ojdbc6.jar 样例例如以下: CREATE OR REP

springMVC + oracle存储过程 构建高性能灵活易维护的java web架构

MVC让简单的业务也变得复杂 不知道你在使用MVC模式开发项目的时候是否觉得很麻烦,一个简单的增删改查动作却要涉及到多个文件操作. 以一条数据增加为例说明. 假设我们使用hibernate并且dao层是已经封装好的 从图中可以看出如果我们在系统中写一个增加功能需要自己动手写的地方至少是 jsp , action , service,servicesImpl 四层. 如果是复杂的添加操作那么我们很可能还会自己定义dao层的接口和方法,那样就是6层操作了. 如果使用mybatis 至少也是写4层,常

Oracle 存储过程

存储过程:就是一组用于完成特定数据库功能的SQL 语句集,该SQL语句集经过编译后存储在数据库系统中.在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数来调用并执行它,从而完成一个或一系列的数据库操作. Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常. 1 create or replace procedure 过程名 2 as ...; --声明语句段 3 begin 4 ...; --执行语句段 5 exception --异常处理语句段 6 ...

Oracle 存储过程定义和优点及与函数区别

定义: 存储过程(Stored Procedure )是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程. 存储过程是由流控制和SQL 语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可.在ORACLE 中,若干个有联系的过程可以组合在一起构成程序包. 优 点: 1.(预编译)存储过程只在创造

jdbc调用 oracle 存储过程操作

创建有参存储函数findEmpNameAndSal(编号),查询7902号员工的的姓名和月薪,[返回多个值,演示out的用法]当返回2个或多个值,必须使用out符号当返回1个值,就无需out符号 create or replace function findEmpNameAndSal(pempno in number,pename out varchar2) return numberas psal emp.sal%type;begin select ename,sal into pename,

Oracle ——存储过程

1.带参数的存储过程CREATE OR REPLACE PROCEDURE sp_pro2 (spname VARCHAR2, newsal NUMBER) ISBEGIN     UPDATE emp SET sal = newsal WHERE ename=spname;END; --参数VARCHAR2不需要指定大小exec sp_pro2('SMITH',10);或者call sp_pro2('SMITH',10); Oracle --存储过程,布布扣,bubuko.com

面试概率极大的Oracle存储过程

1.什么是存储过程.存储过程是数据库服务器端的一段程序,它有两种类型.一种类似于SELECT查询,用于检索数据,检索到的数据能够以数据集的形式返回给客户.另一种类似于INSERT或DELETE查询,它不返回数据,只是执行一个动作.有的服务器允许同一个存储过程既可以返回数据又可以执行动作.2.什么时候需要用存储过程 如果服务器定义了存储过程,应当根据需要决定是否要用存储过程.存储过程通常是一些经常要执行的任务,这些任务往往是针对大量的记录而进行的.在服务器上执行存储过程,可以改善应用程序的性能.这