oracle程序加密,oracle加密
我们在Oracle存储过程中所包含的商业秘密,有时不愿意被第三方人员看到,可以通过对存储过程加密来实现。
有两种加密存储过程的方法:使用wrap工具或dbms_ddl包。下面我们分别介绍一下。
1. wrap工具
Wrap是Oracle所提供的操作系统级的命令,语法如下:
wrap iname=input_file oname=output_file
参数iname为要加密的文件名,oname为加密后的文件名。如果省略oname,那么将会自动产生一个同名的加密文件名,且后缀为plb,其保存路径默认是在user下面。
我们来演示一下wrap工具的用法。首先创建一个名称为test1.sql的文件:
CREATE OR REPLACE FUNCTION get_date_string RETURN VARCHAR2 AS
BEGIN
RETURN TO_CHAR(SYSDATE, ‘DD-MON-YYYY’);
END get_date_string;
/
它保存在D盘根目录。现在我来将它加密:
D:\>dir test* 驱动器 D 中的卷是 D 卷的序列号是 15C2-D261
D:\ 的目录
2009-12-26 16:35 138 test1.sql
1 个文件 138 字节
0 个目录 2,052,046,848 可用字节
D:\>wrap iname=d:\test1.sql oname=d:\test1wrap
PL/SQL Wrapper: Release 10.2.0.1.0- Production on 星期六 12月 26 16:36:01 2009
Copyright (c) 1993, 2004, Oracle. All rights reserved.
Processing d:\test1.sql to test1.plb
看看加密后的文件test1wrap.plb中的内容:
CREATE OR REPLACE FUNCTION get_date_string wrapped
a000000
354
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
8
71 ae
P29RDhRZX0orO0ED/mMF8i12Glkwg8eZgcfLCNL+XlquYvSuoVah8JbRPpdHDOrnwLK9spte
58d0wDO4dGUJuHSLwMAy/tKGCamhAs7G1hohrO/WTHaEcTKOd0xx9RBzc/XvN2dM6+zZPXLp
r1UqFBwU/Sx2010pwUjXpqZCvywG
/
现在你可以把文件test1.plb发给客户使用了,而不必担心你的源代码的暴露。
这个工具使用起来很简单,也很方便,尤其可以批量生成存储过程的加密文件。
2. dbms_ddl包
从Oracle 10g Release 2开始,你可以使用DBMS_DDL包来动态加密存储过程。
如果你只想将写完的源代码进行加密,就像刚才我们讲到的wrap工具那样,你可以使用dbms_ddl.wrap函数;如果你想加密源代码并在数据库中创建它,那么你可以使用dbms_ddl.create_wrapped。
2.1 wrap
如果你不想创建这个过程,而只是想获得这个加密后的创建脚本,然后把脚本发给客户去执行,这可以使用函数dbms_ddl.wrap。它的功能和“wrap“工具相同。我们先看一下这个函数的定义:
FUNCTION wrap(ddl VARCHAR2) RETURN VARCHAR2;FUNCTION wrap(ddl dbms_sql.varchar2s, lb PLS_INTEGER, ub PLS_INTEGER) RETURN dbms_sql.varchar2s;
FUNCTION wrap(ddl dbms_sql.varchar2a, lb PLS_INTEGER, ub PLS_INTEGER)
RETURN dbms_sql.varchar2a;
它被重载了三次:第一个函数接收VARCHAR2类型的输入,后两个函数接收VARCHAR2集合的输入(允许大的DDL语句的输入)。
入参ddl要求语法为”create or replace…”的字符串,用以创建包、包体、类型、类型体、函数和过程的程序单元的DDL语句。如果入参ddl所定义的程序单元不能被加密,或存在语法错误,则将抛出“MALFORMED_WRAP_INPUT”异常。
入参lb为加密集合的最低元素,ub为加密集合的最高元素。
返回值即为加密后的代码。你可以将它写入一个文件中,或者存储在表中。
我们先使用第一个wrap函数实现一个简单的应用。我想获取如下过程加密后的代码:
create or replace procedure p2asbegin
dbms_output.put_line(’yuechaotian’);
end;
使用wrap函数来实现它:
SQL> select dbms_ddl.wrap(’create or replace procedure p2 as begin dbms_output.put_line(”yuechaotian”); end; ‘) 2 from dual;
DBMS_DDL.WRAP(’CREATEORREPLACEPROCEDUREP2ASBEGINDBMS_OUTPUT.PUT_LINE(”YUECHAOTIAN”);END;’)
—————————————————————————
create or replace procedure p2 wrapped
a000000
354
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
7
41 7d
ND2TI3IsThvViemtwIoHec7RMCMwg5nnm7+fMr2ywFwWfAm4dCu4wDL+0l64UpuySv4osr3n
srMdBjAsriTqsoGXJXddX9vk8UfbejIu9kTqJB/2RDmmF3HTZA==
所生成的密文,你可以直接拷贝过来在数据库中执行:
SQL> create or replace procedure p2 wrapped 2 a000000 3 354
4 abcd
5 abcd
6 abcd
7 abcd
8 abcd
9 abcd
10 abcd
11 abcd
12 abcd
13 abcd
14 abcd
15 abcd
16 abcd
17 abcd
18 abcd
19 7
20 41 7d
21 ND2TI3IsThvViemtwIoHec7RMCMwg5nnm7+fMr2ywFwWfAm4dCu4wDL+0l64UpuySv4osr3n
22 srMdBjAsriTqsoGXJXddX9vk8UfbejIu9kTqJB/2RDmmF3HTZA==
23 /
过程已创建。
SQL> exec p2
yuechaotian
PL/SQL 过程已成功完成。
你也可以把它保存到纯文本文件或表中,在以后执行。如果你生成的代码要在其它地方部署,并且必须要保证代码的安全性,则这种方法很有用。
注意,这里的源代码是以VARCHAR2类型传递给wrap函数的。因为VARCHAR2类型的长度有限制(32767字节),对于很长的过程(比如一个2w行的包体),就得使用另外两个重载的wrap函数了:
FUNCTION wrap(ddl dbms_sql.varchar2s, lb PLS_INTEGER, ub PLS_INTEGER) RETURN dbms_sql.varchar2s;FUNCTION wrap(ddl dbms_sql.varchar2a, lb PLS_INTEGER, ub PLS_INTEGER)
RETURN dbms_sql.varchar2a;
这里的输入输出使用联合数组(associative array)来实现。两者的不同在于类型dbms_sql.varchar2s限制为每行256字节,而类型dbms_sql.varchar2a为32767字节。我们举一个例子:
SET SERVEROUTPUT ON SIZE UNLIMITEDDECLARE l_source DBMS_SQL.VARCHAR2A;
l_wrap DBMS_SQL.VARCHAR2A;
BEGIN
l_source(1) := ‘CREATE OR REPLACE FUNCTION get_date_string RETURN VARCHAR2 AS ‘;
l_source(2) := ‘BEGIN ‘;
l_source(3) := ‘RETURN TO_CHAR(SYSDATE, ”DD-MON-YYYY”); ‘;
l_source(4) := ‘END get_date_string;’;
l_wrap := SYS.DBMS_DDL.WRAP(ddl => l_source,
lb => 1,
ub => l_source.count);
FOR i IN 1 .. l_wrap.count LOOP
DBMS_OUTPUT.put_line(l_wrap(i));
END LOOP;
END;
/
CREATE OR REPLACE FUNCTION get_date_string wrapped
a000000
b2
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
8
6f
aa
mV4eMSJ8EqqgErJT91l6UZ0pdDUwgyr6LZ5GfHSmUPiJfkEObQpeDb6D7glajI+ONulxdqC1
0HvOPP4eJpQs5zxsKXpj6XL1
fvieXyWCr3BTzXTqcGYhfXrtqDVPztR/o+9UZ8l5OijDSsRW
ZPv6rISzFyqeEsCBweFUFyxd
PL/SQL procedure successfully completed.
2.2 create_wrapped
除了wrap函数外,在dbms_ddl包中还包括三个重载的create_wrapped过程:
PROCEDURE create_wrapped(ddl VARCHAR2);
PROCEDURE create_wrapped(ddl dbms_sql.varchar2s, lb PLS_INTEGER,
ub PLS_INTEGER);
PROCEDURE create_wrapped(ddl dbms_sql.varchar2a, lb PLS_INTEGER,
ub PLS_INTEGER);
它们拥有和wrap一样的入参和出参。使用方法也和wrap函数类似,不过要注意它们是过程(而不是函数)。
与函数wrap不同,过程create_wrapped不但加密源代码,而且还会在数据库中执行加密后的密文。我们先看一个例子,我要在数据库中以加密的方式创建这个过程:
create or replace procedure p1asbegin
dbms_output.put_line(’yuechaotian’);
end;
我可以借助过程dbms_ddl.create_wrapped:
SQL> begin 2 dbms_ddl.create_wrapped 3 (’create or replace procedure p1
4 as
5 begin
6 dbms_output.put_line(”yuechaotian”);
7 end;’);
8 end;
9 /
PL/SQL 过程已成功完成。
SQL> set serveroutput on
SQL> exec p1
yuechaotian
PL/SQL 过程已成功完成。
看看加密后的代码:
– 1. 从视图 user_source 中查询SQL> set pagesize 1000SQL> col text format a100
SQL> set line 2000
SQL> SELECT TEXT FROM user_source WHERE NAME = ‘P1′;
TEXT
————————————————————————–
procedure p1 wrapped
a000000
354
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
7
4a 81
aVtlrmIdKjyE1rQszxgCZ9Z7+YEwg5nnm7+fMr2ywFwWfF0Jabh0OdPc4rlBP2ejNa+V+nhX
GSQhFMohoijjhhB6c3Eqd9UMXreC004MZbZOdyo7N55Mc3HyiKbboLaf
– 2. 使用 get_ddl 查询
SQL> set long 10000
SQL> select dbms_metadata.get_ddl(’PROCEDURE’,'P1′) from dual;
DBMS_METADATA.GET_DDL(’PROCEDURE’,'P1′)
————————————————————————
CREATE OR REPLACE PROCEDURE “TEST”.”P1″ wrapped
a000000
354
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
7
4a 81
aVtlrmIdKjyE1rQszxgCZ9Z7+YEwg5nnm7+fMr2ywFwWfF0Jabh0OdPc4rlBP2ejNa+V+nhX
GSQhFMohoijjhhB6c3Eqd9UMXreC004MZbZOdyo7N55Mc3HYiKbboLaf
这样,你就在数据库中创建了一个加密源代码的存储过程。
oracle程序加密,oracle加密相关推荐
- oracle程序窗口,oracle窗口函数的使用
窗口函数可以计算一定 记录范围内.一定值域内.或者一段时间内的累计和以及移动平均值等等.之所以使用窗口这个术语,是因为对结果的处理使用了一个滑动的查询结果集范围. 窗口可以与下面这些函数结合使用:su ...
- [已修复] CredSSP 加密 Oracle 修复
安全支持提供者接口或 SSPI 帮助应用程序使用网络或计算机中的现有安全模型. SSPI 的好处是它可以在不改变安全系统接口的情况下这样做. SSPI 实现了一个名为 Credential Secur ...
- 出现身份验证错误,要求的函数不受支持(这可能是由于CredSSP加密Oracle修正)
问题描述: 从5月8\9日开始客户端Win10\WinSer2016突然无法访问测试环境下所有远程Win Ser2012/16资源,提示"出现身份验证错误.要求的函数不受支持... 这可能是 ...
- Oracle PL/SQL 源代码加密实战
文章目录 PL/SQL 源代码加密概述 加密的原则 加密局限性 使用 wrap 工具加密 PL/SQL 代码 使用 DBMS_DDL 加密 PL/SQL 代码 大家好,我是只谈技术不剪发的 Tony ...
- Oracle中对列加密的方法
Oracle支持多种列加密方式: 1,透明数据加密(TDE): create table encrypt_col(id int, txt varchar2(100) encrypt using '算法 ...
- 出现身份验证错误,要求的函数不受支持 可能是由于CredSSP加密Oracle修正。
之前好好的能远程桌面连接到服务器,但是今天来就不能连接上了,并提示:身份验证错误.要求的函数不受支持.猜想可能是Windows又更新了什么鬼,后面查询资料知道是由于CredSSP加密Oracle修正的 ...
- 远程桌面,身份验证错误:CredSSP加密Oracle修正。要求的函数不正确等解决办法
windows版本10.0.17134,安装最新补丁后无法远程windows server 2008.2013.2016服务器 报错信息如下:出现身份验证错误,要求的函数不受支持 可能是由于Cred ...
- 连接远程服务器CredSSP加密Oracle修正报错解决办法
连接远程服务器CredSSP加密Oracle修正报错解决办法: 打开注册表,快捷输入 "regedit"(类似找命令提示符 输入 cmd 一样)找文件夹 路径:HKLM(缩写)\S ...
- 远程连接windows出现身份验证错误,提示由于CredSSP加密Oracle修正解决方案
本机操作系统(OS版本:10.0.17134) 远程计算机操作系统(OS版本:6.3.9600) 远程连接的时候报错"出现身份验证错误,要求的函数不受支持.远程计算机:xxx 这可能是由于C ...
- oracle win10家庭版,Windows10远程报错:由于CredSSP加密Oracle修正(ps:Win10家庭版)
Windows10远程桌面连接 报错信息 : 网上找到方法 但是奈何是 "Win10家庭版" 不能使用这个办法,具体操作可以看最后的引用链接 !!!! 策略路径:"计算机 ...
最新文章
- 大用户规模互联网架构发展
- python—多进程之进程池
- 编译原理last集c语言,编译原理作业集-第七章.doc
- 小程序 php wecahtpay,【PHP】laravel 实现微信小程序微信支付功能
- 【java】System.arraycopy为什么快
- SQLite学习手册(目录)
- JavaScript设计模式与开发实践系列之单例模式
- cacti支持中文办法
- 【华为机考】2022年华为研发人员在线笔试
- Halide-based IR和 Polyhedral-based IR
- 12306Bypass-分流抢票 火车票抢票攻略
- 《2021企业数智化转型升级创新服务企业》榜重磅发布
- 电脑上怎么设置时间提醒?有哪些电脑桌面时钟提醒便签?
- 【记忆化搜索/数位DP】zznu2175(长度为n的含有ACM的字符串)
- 从虚拟光驱启动计算机,电脑如何使用虚拟光驱装系统Windows
- 大数据必学Java基础(二十六):数组的应用题
- 【嵌入式基础】基于IIC和SPI协议的温湿度采集与OLED显示
- dodo:人脸识别方法个人见解(三部分汇总)
- Facebook 秘钥散列
- NEM Venture 戰略投資 Cyclebit,開啟 Cyclebit Token 接受在線和店內加密貨幣的公司
热门文章
- linux centos7 docker 安装 oracle
- w​i​n​8​.1​无​线​上​网​ ​B​r​o​a​d​c​o​m​ ​8​0​2​.​1​1​n​ ​受​限​问​题
- GetMessage和PeekMessage的区别
- java反射机制--reflection
- Linux文件系统基础之inode和dentry
- matlab dsearchn,cKDTree与dsearchn
- 剑指 Offer 43. 1~n整数中1出现的次数
- 什么是mysql分发版_MySQL:使用源码分发版还是二进制分发版
- mysql 5.6 emoji_让MySQL支持Emoji表情 mysql 5.6
- mysql的关键词使用顺序_sql关键词执行先后顺序是什么