oracle怎么加密 Oracle加密
Oracle如何加密视图源码?
最简单的,把sys收了,异用户查询授权。
成都创新互联主要从事网站制作、网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务尖扎,十年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18982081108
要是涉及到代码移交,那就用函数实现view,然后用DBMS_DDL.WRAP加密
Oracle下如何用wrap加密自己的源代码
可以使用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风格(/*…*/)注释外,其它所有注释被删除。
关于oracle数据库加密的函数
Oracle 提供两种加密方式:
a)加密 API 例如包 和 dbms_crypto 使用这些包,可以构建我们自己的基础架构,对数据进行加密。 这种方法的灵活性最强,但是构建和管理却相当复杂。
b)透明的数据加密是 Oracle 数据库 ;使用该特性后,就不必手动进行密码管理了。
数据库管理密码,但是正如名称所指,加密是透明的——数据仅仅以加密的方式存储而已。在Oracle10g中出现了dbms_crypto替代了之前的dbms_obfuscation_toolkit,DBMS_CRYPTO增加了若干新的加密算法、哈希算法。
DBMS_CRYPTO还撤销了对于public组的执行权限。
如何在oracle 10g r2中实现透明数据加密
设置加密密钥:
Oracle 透明数据加密提供了实施加密所必需的关键管理基础架构。 加密的工作原理是将明文数据以及秘密(称作密钥)传递到加密程序中。 加密程序使用提供的密钥对明文数据进行加密,然后返回加密数据。 以往,创建和维护密钥的任务由应用程序完成。 Oracle 透明数据加密通过为整个数据库自动生成一个万能密钥解决了此问题。 在启动 Oracle 数据库时,管理员必须使用不同于系统口令或 DBA 口令的口令打开一个 Oracle Wallet 对象。 然后,管理员对数据库万能密钥进行初始化。 万能密钥是自动生成的。
性能:
由于索引数据未被加密,因此加密通常会影响现有的应用程序索引。 Oracle 透明数据加密对与给定应用程序表关联的索引值进行加密。 这意味着应用程序中的相等搜索对性能的影响很小,甚至没有任何影响。 例如,假设应用程序 card_id存在一个索引,并且此应用程序执行以下语句:
SQL Select cash from credit_card where card_id = '1025023590';
Oracle 数据库将使用现有的应用程序索引,尽管 card_id信息已经在数据库中加密。
准备用于加密的数据库:
在本部分内容中,您将更新 sqlnet.ora、创建一个加密钱夹 (ewallet.p12)、打开此钱夹并为 TDE创建万能密钥。执行以下操作:
1. 您需要更新 sqlnet.ora 文件以包含一个 ENCRYPTED_WALLET_LOCATION 条目。打开一个终端窗口,然后输入以下命令:
cd $ORACLE_HOME/network/admin
gedit sqlnet.ora
将以下条目添加到文件末尾:
ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/opt/oracle/admin/test97/wallet/)))
如果不加这一项的话,则会提示下面错误:
SQL alter system set key identified by "hurray"
2 ;
alter system set key identified by "hurray"
*
ERROR at line 1:
ORA-28368: cannot auto-create wallet
/opt/oracle/admin/test97/wallet/ 目录是用来存放生成的钱夹的。
可以为加密钱夹选择任何目录,但路径不应指向在数据库安装过程中创建的标准模糊钱夹(cwallet.sso)。
2. 接下来,您需要打开钱夹并创建万能加密密钥。从终端窗口中,输入以下命令:
connect / as sysdbaalter system set key identified by "welcome1";
此命令的作用为:
l 如果指定的目录中不存在加密钱夹,则将创建加密钱夹 (ewallet.p12)、打开此钱夹并创建/重新创建 TDE 的万能密钥。
l 如果指定目录中存在加密钱夹,则将打开此钱夹并创建/重新创建 TDE 的万能密钥。
之后,就可以测试数据了。
下面是实验记录:
alter system set key identified by "welcome1";
SQL conn dodd/dodd123
create table test (id number,credit_card_number varchar2(16) ENCRYPT NO SALT);
SQL insert into test values(1,'1231243242');
1 row created.
SQL insert into test values(2,'33245235');
SQL commit;
Commit complete.
SQL select * from test;
ID CREDIT_CARD_NUMB
---------- ----------------
1 1231243242
2 33245235
可见,数据查看是明文,因为这个时候,加密钱夹已经打开,数据可以解密。
这时,停止数据库,再打开:
SQL shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL SQL startup
ORACLE instance started.
Total System Global Area 524288000 bytes
Fixed Size 1979968 bytes
Variable Size 138414528 bytes
Database Buffers 377487360 bytes
Redo Buffers 6406144 bytes
Database mounted.
Database opened.
SQL select * from dodd.test;
select * from dodd.test
*
ERROR at line 1:
ORA-28365: wallet is not open
SQL select id from dodd.test;
ID
----------
1
2
可以看到,因为数据库重启后,加密钱夹处于关闭状态,这时只要查询到加密的列,会提示加密钱夹没有打开。
如果用户想打开钱夹,必须具有alter system权限。
下面打开wallet:
SQL conn / as sysdba
Connected.
SQL alter system set wallet open identified by "welcome1";
System altered.
SQL conn dodd/dodd123
Connected.
SQL select * from test;
ID CREDIT_CARD_NUMB
---------- ----------------
1 1231243242
2 33245235
可以看到,加密钱夹打开后,数据可以被解密。
还有一条:sys用户的表不能被加密。
可见:Oracle TDE是在数据层面上对表里的数据加密,而且不会影响数据库现有的权限控制策略。
salt实际上就是在加密过程中引入一个随机性。简单的说,就是一般来说,同样的明文产生同样的密文,这样就导致容易被解密者通过分析词频之类的方式(加解密我不太懂)来通过密文破解明文,如果指定salt,那么即使同样的明文加密后的密文也是不一样的。
no salt的话,自然就是相同的明文会产生相同的密文了。对于索引来说,要求no salt也就可以理解了
丢失ewallet加密钱夹的话,是不能再解密数据的。
Oracle 10gR2的 TDE 特性,对于防止机密信息的泄漏能起到事半功倍的作用!
Oracle--使用Wrap工具加密你的SQL
Oracle提供Wrap工具 可以用于加密你的Package等
不过需要注意的是 加密后的代码无法解密 你需要保管好你的源代码
以下是个例子
源代码
create or replace function get_rowid
(l_rowid in varchar )
return varchar
is
ls_my_rowid varchar ( )
rowid_type number;
object_number number;
relative_fno number;
block_number number;
row_number number;
begin
dbms_rowid rowid_info(l_rowid rowid_type object_number relative_fno block_number row_number)
ls_my_rowid := Object# is : ||to_char(object_number)||chr( )||
Relative_fno is : ||to_char(relative_fno)||chr( )||
Block number is : ||to_char(block_number)||chr( )||
Row number is : ||to_char(row_number)
return ls_my_rowid ;
end;
/
代码功能测试
[oracle@jumper tools]$ sqlplus scott/tiger
SQL*Plus: Release Production on Mon Nov : :
Copyright (c) Oracle Corporation All rights reserved
Connected to:
Oracle i Enterprise Edition Release Production
With the Partitioning option
JServer Release Production
SQL @f_get_rowid
Function created
SQL select rowid from dept where deptno= ;
ROWID
AAABiPAABAAAFRSAAA
SQL select get_rowid( AAABiPAABAAAFRSAAA ) from dual;
GET_ROWID( AAABIPAABAAAFRSAAA )
Object# is :
Relative_fno is :
Block number is :
Row number is :
SQL !
[oracle@jumper tools]$ ls
ct sql ddlt sql f_get_rowid sql getevent sql
使用wrap加密及加密后的代码
[oracle@jumper tools]$ wrap iname=f_get_rowid sql oname=f_get_rowid plb
PL/SQL Wrapper: Release Production on Mon Nov : :
Copyright (c) Oracle Corporation All Rights Reserved
Processing f_get_rowid sql to f_get_rowid plb
[oracle@jumper tools]$ cat f_get_rowid plb
create or replace function get_rowid wrapped
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
:e:
FUNCTION:
GET_ROWID:
L_ROWID:
VARCHAR :
RETURN:
LS_MY_ROWID:
:
ROWID_TYPE:
NUMBER:
OBJECT_NUMBER:
RELATIVE_FNO:
BLOCK_NUMBER:
ROW_NUMBER:
DBMS_ROWID:
ROWID_INFO:
Object# is :::
||:
TO_CHAR:
CHR:
:
Relative_fno is :::
Block number is :::
Row number is :::
a d f a b d b
: a c a a a a c
b a a c b a
a c b a a c
b a a c b a a
c b : a b : a a
a e e : a a b b e
e a a b b e e
e b e e : a a b b
e e a a b b e
e e b e e : a a b
b e e a a b b
e e e b e e : a a
b b e d : a b a
b f d b
f e b b
c b
c
d c a c
a c b b bc dd
cc d d c e e eb
ef f f fb ff
d d e
d
c a e
b e
e c f
a b a
b d e a a ab ac b
b b bc bd bf c c c
cd d d d db dd e ed
ef f f
a d : :
: e : e : : d :
: : : f : : f : : d
: d b
: e : : c
e : e : :
: : d f : f
: : :
: d f : f :
: : : :
:
: : :
: : : :
: : : a :b c
: d e : d : e
: d : e : d e
f : d : f : d
: f : d f
: d : : d :
: b :
fb
: :
:a e :
:
: :
: :
:
e a
: b
:
: d f
:
c :
f d
: :
c
:
: : c
a c
a : c
:
e : f
c b
: :
:
c c :
e : :
: b
c d
: f : c
d :
: a :
b : c :
d : e
: a
: :
: : a
: c a c
e e :
: :
:
: :
:
: :
: b :
c e b b
: :
: :
e
:
: :
b :
: : c
: e
d :
: :
: b
d
: :
: b d
: :
: d :
f
:
a :
: :
a d :
d c d c
a b : e
: a d
: e
:
:
e
c
d
f
b
d
f
d a f
a
f c
a
c
e
b
a
c
d
/
测试加密后的代码
[oracle@jumper tools]$ exit
exit
SQL drop function get_rowid;
Function dropped
SQL @f_get_rowid plb
Function created
SQL select get_rowid( AAABiPAABAAAFRSAAA ) from dual;
GET_ROWID( AAABIPAABAAAFRSAAA )
Object# is :
Relative_fno is :
Block number is :
Row number is :
lishixinzhi/Article/program/Oracle/201311/18606
分享标题:oracle怎么加密 Oracle加密
本文URL:http://cdiso.cn/article/hpeogo.html