数据加密

动态数据(data in motion)和静态数据(data at rest),除了手动加密,其他的加密都需要oracle企业版的高级加密(额外收费——)

 1 静态数据加密

Example:

1 创建一个新的表空间

create tablespace in_the_clear

datafile 'f:\mydb\in_the_clear.dbf' size 1m

创建一个表

  create table t_clear
( id varchar2(30) primary key,
ssn varchar2(11),
address varchar2(80),
credit_card varchar2(30)
)
tablespace in_the_clear;
insert into t_clear (id, ssn, address, credit_card )
values ( 'Look for me', '123-45-6789',
'123 Main Street', '1234-5678-9876-5432' );

然后commit;

Alter system checkpoint;--触发检查点事件。

  • !strings -a /tmp/in_the_clear.dbf | egrep '(Look for me|123)'
  • Linux下查看该数据文件的内容

Oracle把数据类型为number和date的值按原样存储,

如果delete删除了数据,数据仍留在原处,它会保留在数据文件中,除非被其他数据覆盖或者直到有其他数据覆盖,

还可以根据redo文件跟一些归档文件来查出大量信息,还可以根据undo表空间找出一些数据,对于redo文件,oracle提供了log miner工具,可以来检查数据文件的内容

  select a.member
from v$logfile a, v$log b
where a.group# = b.group#
and b.status = 'CURRENT'
and rownum = 1;

F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO04.LOG

获取当前的在线重做日志文件。

!strings -a &REDO | egrep '(Look for me|123)'

2 oracle钱夹

Oracle建议使用多个钱夹,钱夹存储在数据库之外,

 2.1 建立钱夹

在数据库服务器的sqlnet.ora配置文件中作一个修改,

F:\oracle\product\10.2.0\db_1\NETWORK\ADMIN

SQLNET.AUTHENTICATION_SERVICES= (NTS)

# NAMES.DIRECTORY_PATH= (TNSNAMES)

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

ENCRYPTION_WALLET_LOCATION=

(SOURCE=(METHOD=FILE)

(METHOD_DATA=

(DIRECTORY=f:\mydb\) ---指定存放钱夹的目录

)

)

然后

shutdown immediate

startup

ALTER SYSTEM SET ENCRYPTION KEY identified by yhq1314;

ALTER SYSTEM SET ENCRYPTION KEY identified by foobar;

需要打开或者关闭,在数据打开的时候

idle> ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY foobar;

idle> ALTER SYSTEM SET ENCRYPTION WALLET close IDENTIFIED BY foobar;

在以后重启实例后或者关闭了钱夹后,想要查询经过加密的数据,必须打开钱夹

 2.2 透明列级加密(10g)

  create table t_clear
( id varchar2(30) primary key,
ssn varchar2(11),
address varchar2(80),
credit_card varchar2(30) encrypt
)
tablespace in_the_clear;
credit_card varchar2(30) encrypt ----缺省情况下采用192位密钥长度的AES算法。

Encrypt后面 可以加

Using ‘xx’选择对这列使用什么算法aes还是des等

Identified by 密码,指定加密数据使用特定的密码

Salt或no salt

可以手动取消该列的加密

alter table t_clear modify(credit_card decrypt)

同样可以在加密

alter table t_clear modify(credit_card encrypt )

create index idx_credit_card on t_clear(credit_card)—无法对该列创建索引

这样必须在打开钱夹后才能对t_clear表的credit_card列进行操作(dml,select等)

1 加密列的统计信息

对列加密会带来副作用,改变查询计划,

2 列加密的限制

使用索引的能力降低

使用索引时的保护减弱,

无法使用基于函数的索引

无法使用外接约束

 2.3 透明表空间加密(11g)

create tablespace encrypted

datafile '/tmp/encrypted.dbf' size 1m

ENCRYPTION default storage ( ENCRYPT );

表空间的加密的存储没有开销,

3 手动加密实现

手动加密需要使用oracle的2个内置包来实现

Dbms_crypto:更容易键入和读出,支持DES,3DES,RC4,AES还能生成多种散列和消息验证码,如MD5,MD4,SHA-1,能处理RAW,CLOB,BLOB数据类型

手动加密的列必须是raw列类型,必须是16的整数倍,

CREATE OR REPLACE FUNCTION md5_digest(input_string IN VARCHAR2) RETURN VARCHAR2

IS

hex_digest varchar2(32);

digest varchar2(32);

BEGIN

digest := DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING => input_string);

SELECT Lower(RAWTOHEX(digest)) INTO hex_digest FROM dual;

RETURN hex_digest;

END;

利用 Dbms_crypto

Desc  Dbms_crypto

Grant execute on Dbms_crypto to scott

Grant execute on dbms_lock to scott

Md5

 CREATE OR REPLACE FUNCTION md5_digest1(input_string IN VARCHAR2) RETURN VARCHAR2
IS
l_hash raw(32);
BEGIN
l_hash := dbms_crypto.hash(
src=>input_string,
typ=>dbms_crypto.hash_md5);
dbms_output.put_line('digest2=='||l_hash);
RETURN l_hash;
END;
/

select md5_digest1('123456') from dual

declare
l_src_date clob := '';
l_hash raw(200);
begin
l_hash := dbms_crypto.hash(
src=>l_src_date,
typ=>dbms_crypto.hash_md5);
dbms_output.put_line(l_hash);
end;

des

DECLARE
l_credit_card_no VARCHAR2(19) := '1234-5678-9012-3456';
l_ccn_raw RAW(128) := utl_raw.cast_to_raw(l_credit_card_no);
l_key RAW(128) := utl_raw.cast_to_raw('abcdefgh');
l_encrypted_raw RAW(2048);
l_decrypted_raw RAW(2048);
BEGIN
dbms_output.put_line('Original : ' || l_credit_card_no);
l_encrypted_raw := dbms_crypto.encrypt(l_ccn_raw,
dbms_crypto.des_cbc_pkcs5, l_key);
dbms_output.put_line('Encrypted : ' ||
RAWTOHEX(utl_raw.cast_to_raw(l_encrypted_raw)));
l_decrypted_raw := dbms_crypto.decrypt(src => l_encrypted_raw,
typ => dbms_crypto.des_cbc_pkcs5, key => l_key);
dbms_output.put_line('Decrypted : ' ||
utl_raw.cast_to_varchar2(l_decrypted_raw));
END;

Oracle 数据库加密的更多相关文章

  1. P6 EPPM手动安装指南(Oracle数据库)(一)

    P6 EPPM手动安装指南(Oracle数据库) P6 EPPM Manual Installation Guide (Oracle Database) 1.      内容... 1 1.1.    ...

  2. CentOS以及Oracle数据库发展历史及各版本新功能介绍, 便于构造环境时有个对应关系

    CentOS版本历史 版本 CentOS版本号有两个部分,一个主要版本和一个次要版本,主要和次要版本号分别对应于RHEL的主要版本与更新包,CentOS采取从RHEL的源代码包来构建.例如CentOS ...

  3. 【转】oracle数据库开发的一些经验积累

    1.不安装Oracle客户连接Oracle 8的方法  请将以下文件拷贝到运行文件所在目录 一.ODBC动态库 : ctl3d32.dll msvcrt40.dll odbc16gt.dll odbc ...

  4. C#:Oracle数据库带参PLSQL语句的正确性验证

    在有Oracle数据库C#项目中,有一个这样的需求:在界面上配置了带参数的PLSQL语句,但是要通过程序验证其正确性,那么该如何实现?这就是本文要探讨的内容. 一:通过OracleCommand对象的 ...

  5. Oracle数据库的版本变迁功能对比

    Oracle数据库自发布至今,也经历了一个从不稳定到稳定,从功能简单至强大的过程.从第二版开始,Oracle的每一次版本变迁,都具有里程碑意义. 1979年的夏季,RSI(Oracle公司的前身,Re ...

  6. ORACLE透明加密

    --官网文档:https://www.oracle.com/technetwork/cn/tutorials/tde-096009-zhs.html#t概述Oracle 数据库 10g 第 2 版透明 ...

  7. Oracle 数据库导入与出

    Oracle 数据库导入与出 导出( EXPORT )是用 EXP 将数据库部分或全对象的结构和导出 . 导入( 导入( IMPORT )是用 )是用 IMP IMP将 OS 文件中的对象结构和数据装 ...

  8. [转] oracle 数据库 SQL plus 连接方法

    http://hi.baidu.com/zzy382/item/a5b197f97a38e01ba7298832 之前电脑上安装了一个 Oracle  有一段时间没用,就把密码给忘了,按上面链接里的操 ...

  9. 《关于oracle数据库的勒索病毒的预警》

    近日,接部分机构反馈和安全厂商提醒,针对oracle数据库的勒索病毒攻击数量增加.该病毒存在较长潜伏期,会根据数据库实例创建时间距今是否满足1200天决定是否发起攻击.攻击通过执行恶意SQL脚本,加密 ...

随机推荐

  1. FreeBSD 安装过程

    FreeBSD安装步骤: 回车 按默认回车 输入服务器的计算机名 去掉games,加上src安装如下图 Lib32 ports src这三项一定要安装上 回车 选择Manual 进入以后点create ...

  2. WebSocket和HTTP的区别与联系

    WebSocket是一个计算机通讯协议,在单个TCP连接上提供全双工的通讯模式.WebSocket设计用于Web浏览器和Web服务器之间的通讯,但也可以用于其他的客户端和应用服务器.WebSocket ...

  3. centos下安装python2.7.9和pip以及数据科学常用的包

    以前一直用ubantu下的python,ubantu比较卡.自己倾向于使用centos,但默认的python版本太低,所以重新装了一个python和ipython centos6.5安装python2 ...

  4. MapReduce-多个输出(使用MultipleOutput,不指定reduce任务个数)

    多个输出 FileOutputFormat及其子类产生的文件放在输出目录下.每个reduce一个文件并且文件由分区号命名:part-r-00000,part-r-00001,等等.有时可能需要对输出的 ...

  5. 利用Phoenix为HBase创建二级索引

    为什么需要Secondary Index 对于Hbase而言,如果想精确地定位到某行记录,唯一的办法是通过rowkey来查询.如果不通过rowkey来查找数据,就必须逐行地比较每一列的值,即全表扫瞄. ...

  6. MYSQL进阶学习笔记一:MySQL编码设定,会话变量和全局变量!(视频序号:进阶_1-3)

    知识点一:MySQL编码设定(1-2) 服务器编码设定: 查看MySQL服务器端的编码格式: SHOW VARIABLES LIKE ‘char%’; 设定编码格式: SET NAMES ‘utf8’ ...

  7. linux命令:mv命令

    mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录. 1.命令格式: mv [选项] 源文件或目 ...

  8. review16

    java.lang包中的Math类包含许多用来进行科学计算的方法,这些方法可以直接通过类名调用. Math类中还有两个静态常量E和PI,分别表示自然对数和圆周率. 以下是Math类的常用方法 pulb ...

  9. php 策略模式案例

    策略模式,将一组特定的行为和算法封装成类,以适应某些特定的上下文环境. eg:假如有一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有的广告位展示不同的广告.在传统的代码中,都是在 ...

  10. 安全的 ActiveMQ

    本章知识点 ActiveMQ 鉴权 ActiveMQ 授权 怎么创建一个自定义安全插件 使用基于证书的安全保证 简介 安全地访问消息代理以及它的 destinations 是公众关注的焦点.因此,Ac ...