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用户家目录下创建
[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
oracle存储过程加密的更多相关文章
- oracle 存储过程
来自:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 I ...
- Oracle存储过程语法
原文链接:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 ...
- ORACLE存储过程调用Web Service
1. 概述 最近在ESB项目中,客户在各个系统之间的服务调用大多都是在oracle存储过程中进行的,本文就oracle存储过程调用web service来进行说明.其他主流数据库,比如mysql和sq ...
- Oracle存储过程基本语法介绍
Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...
- MyBatis调用Oracle存储过程
MyBatis调用Oracle存储过程 1.无输入和输出参数的存储过程 2.带有输入和输出参数的存储过程 3.返回游标的存储过程 mybatis中的配置文件代码 <resultMap type= ...
- Oracle存储过程(转)
Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...
- Oracle存储过程中异常Exception的捕捉和处理
Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...
- Oracle存储过程动态创建临时表/存储过程执行权限问题--AUTHID CURRENT_USER
关于Oracle存储过程执行权限问题的解决 http://blog.sina.com.cn/s/blog_6ceed3280101hvlo.html (2014-04-02 04:06:28) 转载▼ ...
- ORACLE存储过程学习
存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE ...
随机推荐
- python字典与集合操作
字典操作 字典一种key - value 的数据类型,使用就像我们上学用的字典,通过笔划.字母来查对应页的详细内容. 语法: info = { 's1': "jack", 's3' ...
- Js点击触发Css3的动画Animations、过渡Transitions效果
关键是首先指定动画效果的CSS属性名称,然后在Js中改变这个属性 如果不使用Js触发,可以选择利用css的状态:hover,focus,active 来触发,也可以一开始就触发 下例为Js点击触发过渡 ...
- bzoj4671: 异或图
bzoj4671: 异或图 Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 ( ...
- Nifi flow 备份恢复
1. 备份 copy 下面的文件到本地: conf/flow.xml.gz 2. 恢复 新安装一个nifi的环境,把这个文件copy到conf文件夹下 运行nifi, 在界面上create ...
- rsync服务部署
构建rsync远程同步----------同步源----------------发起端-------------192.168.1.1 192.168.1.101.配置IP地址并保证互通2.确定备份源 ...
- ACM-ICPC 2015 BeiJing
比赛连接:ACM-ICPC 2015 BeiJing 本次比赛只写了 A G 然后 I题随后补 A 有一个正方形土地,上面有若干块绿洲.让你以x0为界限划一条竖线,要求左边绿洲面积>=右 ...
- JAVA多线程之volatile 与 synchronized 的比较
一,volatile关键字的可见性 要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下: 从图中可以看出: ①每个线程都有一个自己的本地内存空间--线程栈空 ...
- Linux:文件系统层次结构标准(Filesystem Hierarchy Standard)
Linux FHS_2.3标准文档:http://refspecs.linuxfoundation.org/FHS_3.0/fhs-3.0.pdf
- 使用 MongoDB 存储日志数据
使用 MongoDB 存储日志数据 线上运行的服务会产生大量的运行及访问日志,日志里会包含一些错误.警告.及用户行为等信息.通常服务会以文本的形式记录日志信息,这样可读性强,方便于日常定位问题 ...
- OpenLayers学习笔记(一)—在线加载谷歌影像地图&离线加载本地瓦片地图
实现根据在线离线判断加载地图, 在线加载谷歌影响地图, 离线加载本地瓦片地图 作者: 狐狸家的鱼 Github: 八至 html代码 <div id="map" tabind ...