Oracle 数据库加密
数据加密
动态数据(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 数据库加密的更多相关文章
- P6 EPPM手动安装指南(Oracle数据库)(一)
P6 EPPM手动安装指南(Oracle数据库) P6 EPPM Manual Installation Guide (Oracle Database) 1. 内容... 1 1.1. ...
- CentOS以及Oracle数据库发展历史及各版本新功能介绍, 便于构造环境时有个对应关系
CentOS版本历史 版本 CentOS版本号有两个部分,一个主要版本和一个次要版本,主要和次要版本号分别对应于RHEL的主要版本与更新包,CentOS采取从RHEL的源代码包来构建.例如CentOS ...
- 【转】oracle数据库开发的一些经验积累
1.不安装Oracle客户连接Oracle 8的方法 请将以下文件拷贝到运行文件所在目录 一.ODBC动态库 : ctl3d32.dll msvcrt40.dll odbc16gt.dll odbc ...
- C#:Oracle数据库带参PLSQL语句的正确性验证
在有Oracle数据库C#项目中,有一个这样的需求:在界面上配置了带参数的PLSQL语句,但是要通过程序验证其正确性,那么该如何实现?这就是本文要探讨的内容. 一:通过OracleCommand对象的 ...
- Oracle数据库的版本变迁功能对比
Oracle数据库自发布至今,也经历了一个从不稳定到稳定,从功能简单至强大的过程.从第二版开始,Oracle的每一次版本变迁,都具有里程碑意义. 1979年的夏季,RSI(Oracle公司的前身,Re ...
- ORACLE透明加密
--官网文档:https://www.oracle.com/technetwork/cn/tutorials/tde-096009-zhs.html#t概述Oracle 数据库 10g 第 2 版透明 ...
- Oracle 数据库导入与出
Oracle 数据库导入与出 导出( EXPORT )是用 EXP 将数据库部分或全对象的结构和导出 . 导入( 导入( IMPORT )是用 )是用 IMP IMP将 OS 文件中的对象结构和数据装 ...
- [转] oracle 数据库 SQL plus 连接方法
http://hi.baidu.com/zzy382/item/a5b197f97a38e01ba7298832 之前电脑上安装了一个 Oracle 有一段时间没用,就把密码给忘了,按上面链接里的操 ...
- 《关于oracle数据库的勒索病毒的预警》
近日,接部分机构反馈和安全厂商提醒,针对oracle数据库的勒索病毒攻击数量增加.该病毒存在较长潜伏期,会根据数据库实例创建时间距今是否满足1200天决定是否发起攻击.攻击通过执行恶意SQL脚本,加密 ...
随机推荐
- MySQL实习训练1
[转载]http://www.cnblogs.com/AndrewXu/p/4779648.html 1. 打开cmd,输入,回车 mysql -uroot -p -P3306 -h127. 1)-u ...
- mysql错误总结-ERROR 1067 (42000): Invalid default value for TIMESTAMP
1. ERROR 1067 (42000): Invalid default value for 'FAILD_TIME' (对TIMESTAMP 类型的子段如果不设置缺省值或没有标志not n ...
- 常用 GDB 命令中文速览
转自:https://linux.cn/article-8900-1.html?utm_source=index&utm_medium=moremore 目录 break -- 在指定的行或函 ...
- css 相对绝对定位
用Div+CSS进行网站布局时,做一些浮动层等特殊特殊效果时要考虑到定位问题.这就要用到Position属性等.Position属性有四个值:static.fixed.absolute和relativ ...
- 安装mysql5.7后无法启动,/var/run/mysqld 目录每次重启后都需要手动去创建--终极解决方案
鉴于很多童鞋反应,mysql5.7安装后出现无法启动,建立/var/run/mysqld 并赋权mysql用户解决了启动的问题,但是重启系统后又出现无法启动的问题,导致/var/run/mysqld ...
- P2610 【[ZJOI2012]旅游】(dfs+树的直径)
楼下那篇题解说实话就是什么都没说,所以我再发一篇正常一点的. 楼下思路大体是正确的,但是之所以是说什么都没说,是因为他有两个比较致命的遗漏.首先是点,这里的点不是平时我们认为的点,如果多少接触过对偶图 ...
- hive学习7(条件函数case)
case函数 语法: CASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END 说明:如果a为TRUE,则返回b:如果c为TRUE,则返回d:否则返回e 实例 ...
- HDU 5037 Frog(2014年北京网络赛 F 贪心)
开始就觉得有思路,结果越敲越麻烦... 题意很简单,就是说一个青蛙从0点跳到m点,最多可以跳l的长度,原有石头n个(都仅表示一个点).但是可能跳不过去,所以你是上帝,可以随便在哪儿添加石头,你的策略 ...
- QT 利用QSplitter 分割区域, 并添加QScrollArea 滚动区域,滚动条
1. QSplitter 分割区域, 可以分割区域中可以随意添加自己的布局 2. #include "dialog.h" #include <QApplication> ...
- review40
使用URL创建对象的应用程序称为客户端程序. URL对象调用InputStream openStream()方法可以返回一个输入流,该输入流指向URL对象所包含的资源. InetAddress类可以将 ...