zoukankan      html  css  js  c++  java
  • Oracle“钱夹”的使用

    最近几年发生了很多脱库的事件,有些时候安全不到位脱库再所避免,但是可以通过某些技术对数据库进行加密,让即使通过脱库得到的库也没法查看。

    在技术层面的实现可以分为应用和数据库层。

    (1)通过在程序端对某些敏感的信息就进行加密进行存放

    (2)通过在数据库端对库进行加密存放

    对于数据库端的技术,Oracle在10g的时候就推出了TDE(Transparent Data Encryption,透明数据加密)特性。这个特性简单来说就是对存放的数据再加了一道壳,脱库拿到的数据库其实是加了这个壳的,拿到也没啥用,除非把这个壳再进行破解。这个壳Oracle给出了这几种加密算法:3DES168、AES128、AES192、AES256。

    使用这个技术大概分为如下几步:

    (1)创建存放壳秘钥的文件夹

    (2)修改 sqlnet.ora配置,在sqlnet.ora文件中指定一个wallet路径

    (3)创建主秘钥

    (4)开启wallet

    (5)创建表空间

    (6)如果粒度要更细一些的话,可以对表以及表的字段进行Encryption

    使用步骤:

    1.创建目录
    mkdir -p $ORACLE_BASE/admin/orcl/wallet

    2.在sqlnet.ora中添加如下
    ENCRYPTION_WALLET_LOCATION = (SOURCE =
    (METHOD = FILE)
    (METHOD_DATA =
    (DIRECTORY =/u01/app/oracle/admin/orcl/wallet)))

    3.创建主秘钥
    ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY password;

    4.数据库如果重启之后,秘钥是会被关闭的,用如下命令可以打开秘钥
    ALTER SYSTEM SET [ENCRYPTION] WALLET OPEN IDENTIFIED BY password

    5.创建表空间
    CREATE TABLESPACE securespace
    DATAFILE '/u01/app/oracle/oradata/orcl/secure01.dbf' SIZE 100M
    ENCRYPTION USING 'AES256'
    DEFAULT STORAGE(ENCRYPT);

    6.剩下的就是使用
    如果需要使用这个特性就可以把表创建在这个表空间上了。对于已经存在的表,可以使用alter table move tablespace的方式进行move(要记得索引也需要rebuild)。

    7.需要注意的:

    wallet密码跟我们这里要修改的master key不是一个东西,wallet密码仅仅是登陆owm或进行wallet时需要输入的密码,而master key是存放在wallet中,用于加密解密数据库的加密列或加密表空间。

    另外还有一个表密钥,如果一个表有多个列需要进行加密,那么在该表上也只会生成一个表级密钥,当前段用户从该表中取回数据时,会首先取出表密钥然后再取出存在wallet中的master key进行对表密钥的解密,最后用解密后的表密钥去解密加密的列或表空间数据,最终返回明文数据给用户。


    测试:

    在这儿做一个效果测试,测试的步骤为创建2个表空间(一个为加密的一个为不加密的),创建2个用户默认的表空间对应这2个表空间,然后分别登陆2个用户,创建同样的表,插入数据,然后最后再操作系统上来看,看能否通过操作系统的命令看到插入的数据。

    1.创建加密的表空间sec_yes

    SQL> create tablespace sec_yes datafile '/u01/app/oracle/oradata/orcl/secyes01.dbf' size 20M
    2 ENCRYPTION USING 'AES256'
    3 DEFAULT STORAGE(ENCRYPT);

    Tablespace created.

    2.创建不加密的表空间sec_no

    SQL> create tablespace sec_no datafile '/u01/app/oracle/oradata/orcl/secno01.dbf' size 20M;

    Tablespace created.

    3.创建用户test1默认表空间为sec_yes

    SQL> create user test1 identified by test1 default tablespace sec_yes;

    User created.

    4.创建用户test2认表空间为sec_no

    SQL> create user test2 identified by test2 default tablespace sec_no;

    User created.

    SQL>

    [oracle@test admin]$ sqlplus / as sysdba

    SQL*Plus: Release 11.1.0.7.0 - Production on Tue Feb 16 17:12:14 2016

    Copyright (c) 1982, 2008, Oracle. All rights reserved.


    Connected to:
    Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options

    5.登陆用户test1创建表并插入数据

    SQL> conn test1/test1
    Connected.

    SQL> create table test1 (remark varchar2(20));

    Table created.

    SQL> insert into test1 values ('show me the money');

    1 row created.

    SQL> commit;

    Commit complete.

    6.登陆用户test2创建表并插入数据

    SQL> conn test2/test2
    Connected.
    SQL> create table test2 (remark varchar2(20));

    Table created.

    SQL> insert into test2 values ('show me the money');

    1 row created.

    SQL> commit;

    Commit complete.

    7.将脏数据写入到磁盘

    SQL> ALTER SYSTEM FLUSH BUFFER_CACHE;

    System altered.

    SQL> exit
    Disconnected from Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options

    8.进入到存放数据文件的地方,用strings命令看能否查看到数据
    [oracle@test admin]$ cd /u01/app/oracle/oradata/
    [oracle@test oradata]$ ls
    orcl
    [oracle@test oradata]$ cd orcl/
    [oracle@test orcl]$ ls
    control01.ctl control03.ctl redo01.log redo03.log secyes01.dbf system01.dbf undotbs01.dbf
    control02.ctl example01.dbf redo02.log secno01.dbf sysaux01.dbf temp01.dbf users01.dbf
    [oracle@test orcl]$ strings secyes01.dbf | grep "show"
    [oracle@test orcl]$ strings secno01.dbf | grep "show"
    show me the money
    [oracle@test orcl]$

    可以看到没有加密的表空间能看到存入的数据,而加密了的表空间则看不到。

  • 相关阅读:
    Centos7:Redis3.0集群搭建
    Centos7:Redis的安装,配置及使用
    nginx 配置反向代理和负载均衡
    Centos7:nginx的安装,配置及使用
    Centos7:dubbo监控中心安装,配置和使用
    Centos7:配置防火墙
    MarkDown常用语法
    关于获取本地系统时间是正确的,但插入数据库是错的,相差8小时
    Uncaught TypeError: Cannot read property 'getters' of undefined
    java mysql连接时出现的问题
  • 原文地址:https://www.cnblogs.com/nazeebodan/p/5193411.html
Copyright © 2011-2022 走看看