引言:平时大家在做项目的时候,经常会遇到把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存储过程加密的更多相关文章

  1. oracle 存储过程

    来自:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 I ...

  2. Oracle存储过程语法

    原文链接:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程  1 CREATE OR REPLACE PROCEDURE 存储过程名  ...

  3. ORACLE存储过程调用Web Service

    1. 概述 最近在ESB项目中,客户在各个系统之间的服务调用大多都是在oracle存储过程中进行的,本文就oracle存储过程调用web service来进行说明.其他主流数据库,比如mysql和sq ...

  4. Oracle存储过程基本语法介绍

    Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...

  5. MyBatis调用Oracle存储过程

    MyBatis调用Oracle存储过程 1.无输入和输出参数的存储过程 2.带有输入和输出参数的存储过程 3.返回游标的存储过程 mybatis中的配置文件代码 <resultMap type= ...

  6. Oracle存储过程(转)

    Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...

  7. Oracle存储过程中异常Exception的捕捉和处理

    Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...

  8. Oracle存储过程动态创建临时表/存储过程执行权限问题--AUTHID CURRENT_USER

    关于Oracle存储过程执行权限问题的解决 http://blog.sina.com.cn/s/blog_6ceed3280101hvlo.html (2014-04-02 04:06:28) 转载▼ ...

  9. ORACLE存储过程学习

    存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE ...

随机推荐

  1. 洛谷3705 [SDOI2017] 新生舞会 【01分数规划】【KM算法】

    题目分析: 裸题.怀疑$ O(n^4log{n}) $跑不过,考虑Edmonds-Karp优化. 代码: #include<bits/stdc++.h> using namespace s ...

  2. 【Gym 100812C】Story of Princess (走完图所有边)

    BUPT2017 wintertraining(15) #7A 题意 给你一个图,n个点m条边,求走遍所有边,至少经过几次点,及输出依次经过的点.n and m (2 ≤ n ≤ 10^5, 1 ≤  ...

  3. AtCoder 瞎做

    目录 ARC 058 E - 和風いろはちゃん / Iroha and Haiku 题意 题解 技巧 代码 ARC 059 F - バイナリハック / Unhappy Hacking 题意 题解 技巧 ...

  4. 【HDU1846】Brave Game(博弈论)

    题面 HDU 题解 \(Bash\ Game\)模板题 #include<iostream> using namespace std; int T,n,m; int main() { io ...

  5. [luogu3628][bzoj1911][APIO2010]特别行动队【动态规划+斜率优化DP】

    题目描述 给你一个数列,让你将这个数列分成若干段,使其每一段的和的\(a \times sum^2 + b \times sum + c\)的总和最大. 分析 算是一道斜率优化的入门题. 首先肯定是考 ...

  6. rt-thread中软件定时器组件超时界限的一点理解

    @2019-01-15 [小记] 对 rt-thread 中的软件定时器组件中超时界限的一点理解 rt_thread_timer_entry(void *parameter)函数中if ((next_ ...

  7. JBoss/Wildfly 配置SQLserver服务器

    JBoss/Wildfly 配置SQLserver服务器 http://blog.csdn.net/haitaolang/article/details/60467118 wildfly standa ...

  8. 用lemon测交互题

    题目类型:传统. 答案比较类型:逐行比较类型(忽略多余空格和制表符). 配置:交互. 编译器参数: -o %s %s.* ..\..\data\%s\judge.cpp -Wl,--stack= ju ...

  9. 第十五篇-EditText做简单的登录框

    TextView和EditText的简单应用. MainActivity.java package com.example.aimee.edittexttest; import android.sup ...

  10. mysql数据库的优化和查询效率的优化

    一.数据库的优化 1.优化索引.SQL 语句.分析慢查询: 2.设计表的时候严格根据数据库的设计范式来设计数据库: 3.使用缓存,把经常访问到的数据而且不需要经常变化的数据放在缓存中,能节约磁盘IO: ...