如何对Oracle中的PL/SQL源码进行加密

日期: 2010-08-05 来源:TechTarget中国 英文

  主要是为了保护PL/SQL源代码,防止PL/SQL代码被非法使用。可以使用wrap 工具或者DBMS_DDL子程序对PL/SQL源码进行加密。wrap工具加密单个源文件,如SQL*Plus脚本。DBMS_DDL子程序加密单个动态生成的PL/SQL单元,如一个CREATE PROCEDURE声明。加密的源文件可以移动,备份,可被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 VARCHAR2 AS
  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 VARCHAR2 AS
  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;

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐