关于pl/sql的代码保护

简介: 在开始学习数据库的时候,总是尝试手动创建数据库,安装完成之后需要运行一些脚本,总是看到屏幕上闪个不停,可以看到大多数的存储过程代码都是一堆乱码,最开始还以为是乱码了。

在开始学习数据库的时候,总是尝试手动创建数据库,安装完成之后需要运行一些脚本,总是看到屏幕上闪个不停,可以看到大多数的存储过程代码都是一堆乱码,最开始还以为是乱码了。:)有时候心血来潮想看看里面的代码,但是基本上都是看到存储过程名或者函数名,再细节的代码都被屏蔽掉了。
大家在运行awr,ash的时候,也看不到核心的代码。所以这些技术细节oracle是不希望开放的。
比如awr,如果看到最关键的地方。dbms_workload_repository的内容又是屏蔽的,还是有些让人郁闷。
-- call the table function to generate the report
select output from table(dbms_workload_repository.&fn_name( :dbid,
                                                            :inst_num,
                                                            :bid, :eid,
                                                            :rpt_options ));

我们在开发自己的程序的时候,根据具体的需求也可以包含代码。当然了是在有这种需求的情况下,要不反倒弄巧成拙。
关于代码的加密有几种方式。
一种是使用wrap命令直接来格式化。这种方式比较直接,操作也很简单。
比如我们有如下的包声明。
create or replace package  pack_bonus as
function get_bonus(param1 in number,param2 in number,param3 in number,param4 in number) return number;
function get_bonus(param1 in number,param2 in number,param3 in number) return number;
function get_bonus(param1 in number,param2 in number)return number;
end;
/

直接使用wrap命令就可以加密了,iname是输入的文件,oname是输出文件。文件名可以自己根据需要来定义。

$ wrap iname=a.sh oname=aaaa.bin

PL/SQL Wrapper: Release 11.2.0.3.0- 64bit Production on Fri Oct 17 08:21:49 2014

Copyright (c) 1993, 2009, Oracle.  All rights reserved.

Processing a.sh to aaaa.bin

>ls -lrt

-rw-r--r-- 1 ora11g dba    305 Oct 17 08:21 a.sh
-rw-r--r-- 1 ora11g dba    309 Oct 17 08:21 aaaa.bin

如果想调用的话,直接在sqlplus中运行就可以了。
SQL> @aaaa.bin

Package created.


第二种属于编程级别的,使用dbms_ddl来实现,可以使用wrap和create_wrap来完成加密。
这两个方法的不同之处在于wrap是加密指定的代码,只会把加密之后的内容显示出来,不会尝试编译。
而create_wrap是尝试编译加密后的代码。
先看一个例子上手。直接调用wrap就打印出了加密后的代码。

set serveroutput on
declare
i_program varchar2(32767);
begin
i_program:='create or replace package  pack_bonus as
function get_bonus(param1 in number,param2 in number,param3 in number,param4 in number) return number;
function get_bonus(param1 in number,param2 in number,param3 in number) return number;
function get_bonus(param1 in number,param2 in number)return number;
end;
';
dbms_output.put_line(DBMS_DDL.wrap(i_program));
end;
/

create or replace package  pack_bonus wrapped

a000000
369
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
ab
cd
abcd
9
11d
a6
o/obm0C7f2ty/o3UQRhkqAQzXJMwg5m49TOf9b9cFlpZ/0qul3LVYiu4dIvAmYHHywjS/l64
v7L0
v5v+mbI857h0wNIqw6XSXqWZgTLAsiX7mQRrmQSMmXXKNiGUrHGE5tZwcfb8VISUXiqz
R7iBxy2L4Ka
mlS9ZLQ==

PL/SQL procedure successfully completed.


还有一种稍微复杂点的方式,但是也是比较实用的。
定义了dbms_sql.varchar2a类型,可以支持每行32k

declare
  source_code  DBMS_SQL.VARCHAR2A;
  wrap_code    DBMS_SQL.VARCHAR2A;
BEGIN
  SELECT
'create or replace package  pack_bonus as
function get_bonus(param1 in number,param2 in number,param3 in number,param4 in number) return number;
function get_bonus(param1 in number,param2 in number,param3 in number) return number;
function get_bonus(param1 in number,param2 in number)return number;
end;
'
  bulk collect into source_code from dual ;
        
  wrap_code := SYS.DBMS_DDL.WRAP(ddl => source_code,
                              lb  => 1,
                              ub  => source_code.count);

  FOR i IN 1 .. wrap_code.count LOOP
    DBMS_OUTPUT.put_line(wrap_code(i));
  END LOOP;  --直到这个地方,还没有开始尝试编译加密的代码,只是打印出来。
  DBMS_DDL.create_wrapped(source_code,source_code.FIRST,source_code.LAST);   --这个步骤是开始尝试编译加密后的代码
END;
/

输出如下。
create or replace package  pack_bonus wrapped

a000000
369
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
ab
cd
abcd
9
11d
a6
o/obm0C7f2ty/o3UQRhkqAQzXJMwg5m49TOf9b9cFlpZ/0qul3LVYiu4dIvAmYHHywjS/l64
v7L0
v5v+mbI857h0wNIqw6XSXqWZgTLAsiX7mQRrmQSMmXXKNiGUrHGE5tZwcfb8VISUXiqz
R7iBxy2L4Ka
mlS9ZLQ==

PL/SQL procedure successfully completed.
运行之后就可以看到有一个package对象就创建好了。

SQL> select object_name from user_objects where object_name='PACK_BONUS';

OBJECT_NAME
--------------------------------------------------------------------------------
PACK_BONUS

目录
相关文章
|
2月前
|
SQL 存储 安全
第七章 SQL错误信息 - SQL错误代码 -400 到 -500
第七章 SQL错误信息 - SQL错误代码 -400 到 -500
40 1
|
2月前
|
SQL 数据库连接 索引
第四章 SQL错误信息 - SQL错误代码 -1 到 -99
第四章 SQL错误信息 - SQL错误代码 -1 到 -99
33 0
|
10天前
|
SQL 分布式计算 DataWorks
DataWorks操作报错合集之在执行SQL查询时遇到报错,代码为[XX000],该怎么解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
5天前
|
SQL 索引
如果想要再SQL代码中生成递增序列,那么步骤是什么
如果想要再SQL代码中生成递增序列,那么步骤是什么
|
20天前
|
SQL 人工智能 自然语言处理
一款利用人工智能将自然语言查询转换为 SQL 代码的互译工具 - SQL Translator
一款利用人工智能将自然语言查询转换为 SQL 代码的互译工具 - SQL Translator
|
1月前
|
SQL 机器学习/深度学习 分布式计算
MaxCompute产品使用合集之sql代码中支持插入jinja语法语句吗
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
1月前
|
SQL 数据库 Perl
PL/SQL中执行按钮变为灰色后如何恢复【已解决】
PL/SQL中执行按钮变为灰色后如何恢复【已解决】
66 0
|
1月前
|
SQL 关系型数据库 数据库
实时计算 Flink版操作报错合集之在本地执行代码没有问题,但是在线执行sql命令就会报错,该怎么办
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
104 0
|
2月前
|
SQL 存储 数据库
第六章 SQL错误信息 - SQL错误代码 -200 到 -399
第六章 SQL错误信息 - SQL错误代码 -200 到 -399
19 1
|
1月前
|
SQL Java 数据库连接
MyBatis SQL 批量更新(代码➕案例)
MyBatis SQL 批量更新(代码➕案例)
141 0