ORACLE TDE (Transparent Data Encryption)

透明的数据加密: 使用oracle的钱夹存储密钥,可对加密列进行索引。数据库管理密码,自动加密解密

TDE可以加密数据文件,撤消日志,重做日志中的数据,还可加密SGA中的缓冲区缓存中的数据,可以选择对哪些表的哪些列进行加密。TDE是基于密钥的加密系统,所以需要配置钱夹wallet。

Wallet: 每个表都有自己的密钥,密钥为数据库创建的主密钥来加密,密钥以加密方法存储在数据库中,主密钥并不存储于数据库中。当访问加密表中的加密列时,授权用户不必指定密码或密钥

使用oracle加密与解密注意事项:

  1. 加密和解密需要额外的CPU资源
  2. 由于无法使用加密状态下的数据这一事实,使得数据库无法对数据进行有效地比较,也不能进行计算,而基本的数据操作也是无效的。不能对加密数据进行索引。
  3. 加密不但向用户,而且数据库隐藏了数据。通常要创建视图来帮助对加密数据进行解密,这带来管理的任务。

  1. 创建钱夹
  1. OUI创建钱夹(owm, oracle wallet manager)

命令行输入owm --- 新建 --- 如果第一次用会提示创建目录 ---- 输入钱夹管理的密码(用于在sql*plus中创建和更改主密钥用) ---- 钱夹类型选STANDARD ---- 提示是否建证书,选no

  1. 手动创建钱夹:

创建一个新目录,并指定为Wallet目录(不创建目录后面会报错)

$ mkdir -p $ORACLE_BASE/admin/wallet

  1. 参数文件sqlnet.ora指定目录位置

$ vi $ORACLE_HOME/network/admin/sqlnet.ora

ENCRYPTION_WALLET_LOCATION=

  (SOURCE=

     (METHOD=FILE)

        (METHOD_DATA=

              (DIRECTORY=/u01/app/oracle/admin/wallet)))

  1. 创建钱夹文件

$ sqlplus sys/oracle as sysdba

SQL> alter system set encryption key identified by "testone";

这时oracle会通过sqlnet.ora文件在目录上创建主密钥文件(ewallet.p12),不管数据库中有多少加密的列,每个表都使用单一的密钥,每个加密表的密钥在被主密钥加密后存于数据字典,即主密钥就是保护密钥的。如果认为主密钥已经受到威胁,可以再用上面的语句生成一个新密钥即可

注:密码"wallet"不加引号时,后面使用时也不需要用引号

注:如果RAC需要在各实例都按上面步骤操作一遍,但是不要创建主密钥文件,而是把上面的ewallet.p12文件复制到各实例下,然后直接启动:alter system set encryption wallet open identified by “testone”;

  1. 启动、关闭Wallet

如果是RAC需要在每个实例都执行开户或关闭:

$ sqlplus sys/oracle as sysdba

SQL> ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "testone";  --开启

SQL> alter system set wallet close identified by "testone";  --关闭

select * from v$encryption_wallet;

WRL_TYPE   WRL_PARAMETER    STATUS

----------------------------------------------------------------------------

file           /u01/app/oracle/admin/wallet OPEN

关闭数据库会自动关闭钱夹,且下次不启动,可以使用自动登录钱夹,auto-login wallet(OWM中设置),它会使创建钱夹的用户登录时打开一直到用户退出时为止(可见很不方便)

  1. 加密表空间: 不能加密临时表空间和撤销表空间

Create tablespace testtest datafile '/u01/app/oracle/oradata/orcl/testtest.dbf' size 10m autoextend OFF encryption using 'aes128' default storage(encrypt);

select TABLESPACE_NAME,ENCRYPTED from dba_tablespaces;

上面指定使用aes算法加密,密钥长度128

这时数据库自动写入此表空间时加密数据,在读取时解密数据,加密和解密由于不在内存进行,并不需要额外空间消耗;此表空间存储的数据文件,使用临时表空间的数据,撤销段和重做日志中的数据将以加密形式保存加密的数据已存在的表空间不能加密,可以使用alter table move,create as select, ,expdp/impdp等方式重建

  1. 加密数据列

默认在对明文加密前,TDE加密向明文添加salt(一个随机字符串),从而使得加密更加难以破解,但对加密列创建索引就必须使用no salt

create table t1(id number, name varchar2(10));

insert into t1 values (1, 'oldvalue');

alter table t1 modify (name encrypt no salt);

insert into t1 values (2,'newvalue');

commit;

conn sys/oracle as sysdba

alter system set wallet close identified by "testone";

conn hr/hr

select id from t1;   --ok

select * from t1 where id =1;  --wrong

所以它同时会把旧数据加密!

注:列上有索引会减慢加密速度,对列的加密会极大增加表和索引中存储的数据的尺寸,更新列就会引起行在数据块中移动,如果更新数据块中的每一行,则会发生行迁移,从而大大地降低性能。需要使用alter table move来消除行迁移。

如果取消加密:alter table t1 modify (name decrypt);

  1. 对备份加密: 主要用透明加密模式,基于密码的加密模式和混合加密模式

透明加密模式:本地不需要设置密码,远程没有信任书不能操作。步骤:

配置sqlnet.ora:

ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)

(METHOD_DATA=(DIRECTORY=E:\app\adinistrator\admin\orcl\wallet)

创建wallet:Alter system set encryption key identified by “密码”;  

RMAN进行备份:  rman>configure encryption for database on;

在以后的恢复时必须打开信任书的情况下才能恢复数据!

基于密码的加密模式:备份时可以设置密码

Rman>set encryption on indentified by “XXX” only;

Rman> backup database;

恢复前必须加Rman>set encryption indentified by “XXX”才行,这个密码是明文的混合加密模式:本地使用信任书,远程使用密码操作

实现方法只是比2)少个only: Rman>set encryption on indentified by “XXX” ;

你可能感兴趣的:(Oracle,oracle)