的动态设置Oracle中动态设置wrap的技巧(oracle中wrap)
动态设置Oracle中动态设置wrap的技巧
在Oracle数据库中,使用wrap可以对存储在数据库中的PL/SQL程序进行混淆保护,使得对源代码的潜在攻击者只能看到一些加密的二进制代码,而不能看到源代码。然而,在实际操作中,由于每次对PL/SQL程序进行变更或升级时都需要重新执行wrap命令,同时需要将wrap后的代码放入源代码所在的目录中,这样才能实现PL/SQL程序的加密保护。为了解决这个问题,本文将介绍如何在Oracle数据库中动态设置wrap。
动态设置wrap的技巧:
1. 创建包
创建一个包,其中定义两个过程:一个过程用于将代码wrap起来,另一个过程用于执行wrap后的代码。具体代码如下:
CREATE OR REPLACE PACKAGE test_wrap
IS
PROCEDURE do_wrap (p_name VARCHAR2, p_type VARCHAR2, p_owner VARCHAR2);
PROCEDURE do_execute (p_name VARCHAR2, p_owner VARCHAR2);
END;
CREATE OR REPLACE PACKAGE BODY test_wrap
IS
PROCEDURE do_wrap (p_name VARCHAR2, p_type VARCHAR2, p_owner VARCHAR2)
IS
v_sql VARCHAR2 (3000);
BEGIN
v_sql := ‘DECLARE v_code VARCHAR2 (32000); BEGIN DBMS_DDL.WRAP (v_code, :1, :2, :3); :4 := v_code; END;’;
EXECUTE IMMEDIATE v_sql
USING p_name,
p_type,
p_owner,
OUT NOCOPY v_wrapped;
/*
* write wrapped code to file (optional)
*/
END do_wrap;
PROCEDURE do_execute (p_name VARCHAR2, p_owner VARCHAR2)
IS
v_code VARCHAR2 (32000);
BEGIN
SELECT text INTO v_code
FROM dba_source
WHERE owner = p_owner
AND name = p_name
AND line = 1;
/*
* read wrapped code from file (optional)
*/
EXECUTE IMMEDIATE v_code;
END do_execute;
END;
通过以上代码可以看到,我们定义了do_wrap和do_execute两个过程来完成wrap和执行wrap后的代码的功能实现。
2. 设置Oracle环境变量
环境变量ORACLE_HOME、ORACLE_SID、LD_LIBRARY_PATH、LD_ASSUME_KERNEL是Oracle数据库运行所必须的环境变量。其中LD_ASSUME_KERNEL变量是用于在Oracle 9i和10g中确保正确设置Linux的kernal version。具体设置方法如下:
export ORACLE_HOME=/opt/oracle/product/10.2.0/db_1
export ORACLE_SID=orcl
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export LD_ASSUME_KERNEL=2.4.19
3. 调用包中的过程
调用包中的do_wrap和do_execute过程,分别实现wrap和执行wrap后的代码的功能实现。具体代码如下:
set serveroutput on;
declare
v_wrapped varchar2(32000);
begin
test_wrap.do_wrap(‘test’,’PROCEDURE’,’SCOTT’);
dbms_output.put_line(v_wrapped);
end;
执行以上代码,会将PROCEDURE test(SCOTT)的源代码wrap起来,并输出到终端窗口中。
总结:通过本文所介绍的动态设置wrap的技巧,可以实现对PL/SQL程序动态wrap的功能实现,从而简化了PL/SQL程序的维护、升级等工作,加强了PL/SQL程序的安全性和可靠性,提高了应用程序的可维护性及运行效率。同时,对于包含大量PL/SQL代码的应用程序,动态设置wrap还可以有效地防止源代码泄露,增强了应用程序的安全性。