加密PL/SQL源代码

来源:互联网 发布:网络监控 距离 编辑:程序博客网 时间:2024/06/05 07:37
 主要是为了保护PL/SQL源代码,防止PL/SQL代码被非法使用。可以使用wrap工具或者DBMS_DDL子程序对PL/SQL源码进行加密。wrap工具加密单个源文件,如SQL*Plus脚本。DBMS_DDL子程序加密单个动态生成的PL/SQL单元,如一个CREATEPROCEDURE声明。加密的源文件可以移动,备份,可被SQL*Plus和Improt和Export工具处理,但在静态数据字典视图*_SOURCE中无法看到源码。

  WRAP语法

  wrap iname=input_file [oname=output_file ]

  可省略文件扩展名,如以下的命令是等同的:

  wrap iname=/mydir/myfile

  wrap iname=/mydir/myfile.sql

  输出文件默认的扩展名为.plb,当然你也可以指定不同的文件名和扩展名。

  wrap iname=/mydir/myfile oname=/yourdir/yourfile.out

  wrap主要是混淆PL/SQL语句的主体部分,如下CREATE语句可以被加密:

  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

  CREATE [OR REPLACE]TRIGGER语句不能被加密,但你可调用加密的过程。加密文件中除了语句头部和C风格()注释外,其它所有注释被删除。

  输出的文件为文本文件,可以在SQL*Plus执行:

  SQL> @myfile.plb;

  DBMS_DDL子程序

  DMBS_DDL包包含WRAP函数和CREATE_WRAPPED过程。CREATE_WRAPPED过程加密语句并创建PL/SQL单元。如下为使用DBMS_DDL.CREATE_WRAPPED加密包的例子:

  DECLARE

  package_text VARCHAR2(32767); — text for creating package spec& body

  FUNCTION generate_spec (pkgname VARCHAR2) RETURN VARCHAR2AS

  BEGIN

  RETURN ‘CREATE PACKAGE ‘ || pkgname || ‘ AS

  PROCEDURE raise_salary (emp_id NUMBER, amount NUMBER);

  PROCEDURE fire_employee (emp_id NUMBER);

  END ‘ || pkgname || ‘;’;

  END generate_spec;

  FUNCTION generate_body (pkgname VARCHAR2) RETURN VARCHAR2AS

  BEGIN

  RETURN ‘CREATE PACKAGE BODY ‘ || pkgname || ‘ AS

  PROCEDURE raise_salary (emp_id NUMBER, amount NUMBER) IS

  BEGIN

  UPDATE employees

  SET salary = salary + amount WHERE employee_id = emp_id;

  END raise_salary;

  PROCEDURE fire_employee (emp_id NUMBER) IS

  BEGIN

  DELETE FROM employees WHERE employee_id = emp_id;

  END fire_employee;

  END ‘ || pkgname || ‘;’;

  END generate_body;

  BEGIN

  — Generate package spec

  package_text := generate_spec(‘emp_actions’)

  — Create wrapped package spec

  DBMS_DDL.CREATE_WRAPPED(package_text);

  — Generate package body

  package_text := generate_body(‘emp_actions’);

  — Create wrapped package body

  DBMS_DDL.CREATE_WRAPPED(package_text);

  END;

 

原文出处:http://oracle.chinaitlab.com/PLSQL/817057.html

0 0
原创粉丝点击