zoukankan      html  css  js  c++  java
  • Oracle 数据库加密

     数据加密

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

     1 静态数据加密

       Example:

    1 创建一个新的表空间

     create tablespace in_the_clear

        datafile 'f:mydbin_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:ORACLEPRODUCT10.2.0ORADATAORCLREDO04.LOG

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

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

    2 oracle钱夹

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

     2.1 建立钱夹

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

    F:oracleproduct10.2.0db_1NETWORKADMIN

    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;
  • 相关阅读:
    【HDU1166】敌兵布阵-单点修改和区间求和
    【HDU1166】敌兵布阵-单点修改和区间求和
    【Ural1028】Stars-线段树和树状数组入门题
    【Ural1028】Stars-线段树和树状数组入门题
    【NOIP2014提高组T3】飞扬的小鸟-完全背包
    【NOIP2014提高组T3】飞扬的小鸟-完全背包
    【POJ2528】Mayor's Posters-线段树+离散化
    【POJ2528】Mayor's Posters-线段树+离散化
    perl use utf8
    encode_utf8 把字符编码成字节 decode_utf8解码UTF-8到字符
  • 原文地址:https://www.cnblogs.com/yhq1314/p/10065699.html
Copyright © 2011-2022 走看看