使用Wrap加密保护Oracle程序源代码
存储过程、函数、包等结构,
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示了软件系统的业务逻辑和领域逻辑。将业务逻辑组织在数据层之上,特别是数据库软件中,是一种比较传统和常见的做法。虽然这种方式与时下流行的
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
理念有差异,但是在实际工作中却有着很多优势。
作为领域逻辑的代表,具体的过程实现对软件企业来说,是一笔重要的无形资产财富,是需要额外进行保护的。但是在Oracle中,我们是可以直接的看到各种函数逻辑的实现。所以,我们需要一种手段,保护在Oracle数据字典中保存的源代码信息。
在Oracle中,推出了Wrap技术,既可以实现代码的加密,使用户不能够直接获取到程序代码的DDL语句,同时不会影响到程序代码的执行。在最新的Oracle版本中,提供了两种方式进行Wrap加密。
1 Wrap命令行工具,可以在命令行中实现源代码文件的加密;
2 Dbms_ddl包,其中包括的方法也可以实现在PL/SQL中进行代码的加密;
非Wrap使用时的情况
首先,我们可以查看在没有进行Wrap处理的时候,Oracle如何进行源代码保存。
演示代码,本文中将使用该段SP作为演示内容。
SQL> create or replace procedure p_wrap_test_nc
2 (o_vc_message out varchar2)
3 is
4 begin
5 dbms_output.put_line('wrap Test Procedure working!');
6 end p_wrap_test_nc;
7 /
Procedure created.
当没有进行Wrap处理的时候,我们可以通过DBMS_METADATA和user_source等数据字典工具查看到源代码。
SQL> set serveroutput on size 10000;
SQL> exec
dbms_output.put_line(dbms_metadata.get_ddl(object_type=>'PROCEDURE',name=>'P_WRAP_TEST_NC'));
CREATE OR REPLACE PROCEDURE "SCOTT"."P_WRAP_TEST_NC" (o_vc_message out
varchar2)
is
begin
dbms_output.put_line('wrap Test Procedure working!'); end
p_wrap_test_nc;
SQL> ;
1 select line,text from user_source
2* where lower(name)='p_wrap_test_nc'
SQL> /
LINE TEXT
---------- -------------------------------------------------------------------------------
1 procedure p_wrap_test_nc
2 (o_vc_message out varchar2)
3 is
4 begin
5 dbms_output.put_line('wrap Test Procedure working!');
6 end p_wrap_test_nc;
6 rows selected.
使用Wrap命令行工具进行加密处理
使用Wrap命令行处理是比较传统的源代码加密手段。思路和过程如下:
1. 将编写好并且调试好的程序,保存为.sql源代码文件,保存在本地磁盘上; 2. 通过命令行工具wrap,将源代码文件处理为加密过的文件(通常为.plb
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
)。此时的文件内容,已经是加密过的;
3. 在Oracle的命令行中执行处理过的加密文件。Oracle可以将加密信息识别为正确的代码信息,并且将加密文保存在数据字典中;
4. 开发人员要妥善保管源代码文件,防止丢失;
下面进行过程演示。
首先,将存储过程定义文件p_wrap_test_nc保存为.sql文件,名称为p_wrap_test_nc.sql,之后进行处理。
Wrap工具有两个参数,iname和oname。Iname指定的进行处理的文件名称,而oname指定的是处理后的输出文件。
//命令行处理
E:\>wrap iname=p_wrap_test_nc.sql oname=p_res_nc.plb PL/SQL Wrapper: Release10.2.0.1.0- Production on星期三5月 18 13:10:46 2011
Copyright (c) 1993, 2004, Oracle. All rights reserved.
Processing p_wrap_test_nc.sql to p_res_nc.plb
此时如果打开输出文件,可以看到加密过的密文代码。
create or replace procedure P_WRAP_TEST_NC wrapped
a000000
93 ce
bmPSrzSW+JbvbB0IrfiI/oW92IYwg0zwfyisfI45kJpkzm6pla+NJokfFPdh3plfljn9C1nb w3O1Zdpo9ZxuTivH2iNAtzHVSfeEjowmNvtLZd6IVzY9f4oEfz5krpcsJuGBN6u5IwMCeYI2
MTT9hjiE/+3uwnVOQwJ1GSxTNNEpkte9Tuws/sGy+FHlNX6DnVLt+Pv3Jz4d....
接下来,通过执行这些加密文件,来创建对象。
//执行生成的代码文件
SQL> @e:\p_res_nc.plb
Procedure created
之后,通过执行存储过程,来确定对象创建。
--执行成功
SQL> set serveroutput on size 10000;
SQL> var x varchar2(100);
exec P_WRAP_TEST_NC(:x); SQL>
Wrap Test Procedure Working !
PL/SQL procedure successfully completed
x
---------
说明
关于失联党员情况说明岗位说明总经理岗位说明书会计岗位说明书行政主管岗位说明书
,数据库中已经建立了该对象,可以执行成功。接下来,我们通过查看数据字典信息确定是否加密。
//获取源文件
SQL> exec dbms_output.put_line(dbms_metadata.get_ddl(object_type => 'PROCEDURE',name => 'P_WRAP_TEST_NC'));
CREATE OR REPLACE PROCEDURE "SYS"."P_WRAP_TEST_NC" wrapped a000000
7
93 ce
bmPSrzSW+JbvbB0IrfiI/oW92IYwg0zwfyisfI45kJpkzm6pla+NJokfFPdh3plfljn9C1nb w3O1Zdpo9ZxuTivH2iNAtzHVSfeEjowmNvtLZd6IVzY9f4oEfz5krpcsJuGBN6u5IwMCeYI2
MTT9hjiE/+3uwnVOQwJ1GSxTNNEpkte9Tuws/sGy+FHlNX6DnVLt+Pv3Jz4d (篇幅原因,有省略……)
PL/SQL procedure successfully completed
//检查数据字典信息
SQL> select line,text from user_source where name='P_WRAP_TEST_NC';
LINE TEXT
---------- --------------------------------------------------------------------------------
1 procedure P_WRAP_TEST_NC wrapped
bmPSrzSW+JbvbB0IrfiI/oW92IYwg0zwfyisfI45kJpkzm6pla+NJokfFPdh3plfljn9C1nb
w3O1Zdpo9ZxuTivH2iNAtzHVSfeEjowmNvtLZd6IVzY9f4oEfz5krpcsJuGBN6u5IwMCeYI2
MTT9hjiE/+3uwnVOQwJ1GSxTNNEpkte9Tuws/sGy+FHlNX6DnVLt+Pv3Jz4d
结论:使用Wrap命令行加密的原则,就是将源代码独立作为文件单独保存,在数据字典中仅仅保存加密过的密文。这样,就剔除了Oracle数据库作为源代码容器的作用,也就防止业务逻辑和关键信息算法的丢失。
除了使用Wrap工具外,还可以使用DBMS_DDL包进行处理。这种方式就是在PL/SQL代码中实现加密处理。
DBMS_DDL包有两个处理方法,一个为Wrap的函数,另一个是Create_Wrap的存储过程。
DBMS_DDL.Wrap函数是将一个字符串(或者类似的结构体),作为参数传入其中,返回加密过的代码信息。但是,wrap函数只是将代码加密,并不执行。