透明的数据加密: 使用oracle的钱夹存储密钥,可对加密列进行索引。数据库管理密码,自动加密解密
TDE可以加密数据文件,撤消日志,重做日志中的数据,还可加密SGA中的缓冲区缓存中的数据,可以选择对哪些表的哪些列进行加密。TDE是基于密钥的加密系统,所以需要配置钱夹wallet。
Wallet: 每个表都有自己的密钥,密钥为数据库创建的主密钥来加密,密钥以加密方法存储在数据库中,主密钥并不存储于数据库中。当访问加密表中的加密列时,授权用户不必指定密码或密钥
使用oracle加密与解密注意事项:
命令行输入owm --- 新建 --- 如果第一次用会提示创建目录 ---- 输入钱夹管理的密码(用于在sql*plus中创建和更改主密钥用) ---- 钱夹类型选STANDARD ---- 提示是否建证书,选no
创建一个新目录,并指定为Wallet目录(不创建目录后面会报错)
$ mkdir -p $ORACLE_BASE/admin/wallet
$ vi $ORACLE_HOME/network/admin/sqlnet.ora
ENCRYPTION_WALLET_LOCATION=
(SOURCE=
(METHOD=FILE)
(METHOD_DATA=
(DIRECTORY=/u01/app/oracle/admin/wallet)))
$ 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”;
如果是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中设置),它会使创建钱夹的用户登录时打开一直到用户退出时为止(可见很不方便)
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等方式重建
默认在对明文加密前,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);
透明加密模式:本地不需要设置密码,远程没有信任书不能操作。步骤:
配置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” ;