Oracle 数据库加密 您所在的位置:网站首页 oracle数据加密解密 Oracle 数据库加密

Oracle 数据库加密

2024-07-12 12:26| 来源: 网络整理| 查看: 265

 数据加密

 动态数据(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 := '123456'; 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;

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有