Welcome 微信登录

首页 / 数据库 / MySQL / Oracle数据透明加密-TDE

介绍  Oracle 10g R2提供了一个新的特性,让你只需要做如下动作:你可以不写一行代码,只需要声明你需要加密某列。当用户插入数据的时候,数据库透明的加密数据然后存储加密后的数据。同样的,当用户读取数据时,数据库自动进行解密。由于加解密操作对应用程序来说都是透明的,不需要应用程序修改代码,因此这个特性就叫做:透明数据加密(TDE)。简单来说默认不对数据进行TDE加密,数据库中的某些敏感数据是直接可以在操作系统层面进行读取的,方法不进行阐述。10gR2 可以对指定列进行加密,11g还可以对表空间进行加密。配置TDE制定master密钥存放位置(位置TNS_ADMIN变量为准)vi  $ORACLE_HOME/network/admin/sqlnet.ora添加如下参数ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY= /home/oracle/app/oracle/admin/orcl/wallet)))Oracle用户手动创建wallet文件夹mkdir /home/oracle/app/oracle/admin/orcl/wallet否则报错ORA-28368: cannot auto-create wallet创建wallet并在其中装入master密钥 SQL> alter system set key identified by "oracle"; System altered.在$ORACLE_BASE/admin/sid/wallet文件夹中生成密钥文件ewallet.p12创建wallet后,它将保持打开状态,直到将其关闭,或者重启数据库。可以检查wallet的状态col wrl_type format a7col wrl_parameter format a55select wrl_type,wrl_parameter,status from gv$encryption_wallet;WRL_TYP WRL_PARAMETER------- -------------------------------------------------------STATUS------------------file    /home/oracle/app/oracle/admin/orcl/walletOPEN手动打开wallet,打开是需要密码的alter system set encryption wallet open identified by  "oracle";也就是说数据库每次重启都需要安全管理专员手动打开wallet,否则加密数据无法读写。当然也可以设置自动登录wallet,但是建议在开发或者测试阶段进行。打开自动登录的方法通过Oracle wallet Manager 运行owm命令打开图形界面,打开现有wallet(找到master密钥存放路径)打开自动登录 在master密钥存放路径中生成一个文件cwallet.sso。关闭wallet可以通过手动关闭walletalter system set wallet close;注意10g关闭不需要wallet口令,如果wallet被关闭,所有的加密解密将自动终止。11g 关闭需要wallet口令,语法如下,否则提示ORA-28390: auto login wallet not open but encryption wallet may be openalter system set wallet close identified by "oracle";另外,如果设置自动登录11g环境下执行关闭命令不需要输入密码SQL> alter system set wallet close; 可以执行成功,但是查询gv$encryption_wallet视图,状态依然是OPEN,而不是closed。  此时查询依然可以查询加密内容。TDE的密钥管理       在对表进行加密时,TDE为每个包含加密字段的表都生成相应的密钥,而不是所有的表都使用相同的密钥。       TDE使用对称密钥技术进行数据加密和解密,性能高。       对于表空间的密钥是存储在数据字典中,前提是它首先使用master密钥对所有的表密钥进行加密。新表创建加密列create table ( encrypt [algorithm] [nomac] [no salt]);[algorithm] 加密算法[nomac] 10.2.0.4才开始有的参数当加密一个列需要额外的20字节存储密文时,将会生成一个消息验证码。[no salt]) salt通过在明文中插入某个随机值(在TED中为一个16字节的值)能够有效的增强加密算法的强度,避免对加密数据的“明文"攻击。create table foo (columnA dataype,columnB dataype encrypt);该句默认使用192为子长密钥的AES加密算法,使用salt以及一个20位的mac。当然,如果希望某列上用索引,最好不要在其上加入salt。查看加密列select owner,table_name,column_name,encryption_alg,salt from dba_encrypted_columns;对现有列进行加密alter table modify  ( encrypt ["nomac"] [no salt]);如果数据量比较大,直接对列加密会增加cpu和存储负载,因此可以考虑使用在线重定义的形式重新组织表。(不赘述)TDE列加密弊端使用数据修改捕获(无论同步还是异步)、流、物化视图、透明表空间、LOB就不能用了,随着11G 引入表空间加密,这一问题得到解决。加密的列如果使用了 salt,则无法在上面创建索引。因为索引存储的是加密后的值,所以即使不使用salt 也只可以使用基于等式匹配的查询,对于范围查询也无能为力。因为不同表密钥不同,因此除非事先解密数据,否则无法发现PK/FK的关系定义。表空间加密表空间加密,其中的所有存储内容都会进行加密。 create tablespace ts_encrypted datafile  "/home/oracle/app/oracle/oradata/ORCL/datafile/ts_encrypted _d08ww9lb_.dbf" size 100m autoextend on encryption using "AES192" default  storage(encrypt);查询表空间加密select ts.name,et.encryptedts,et.encryptionalg from v$tablespace ts,v$encrypted_tablespaces et where ts.ts#=et.ts#;列级别加密步骤1确定待加密的列2确定tde都能够支持此数据类型3确定在该列上不存在索引4确定改了不属于某个PK/FK关系5对列进行加密6重新组织表或在线重定义表空间加密步骤1确定含有敏感数据的列表2创建一个新的加密表空间3使用alert table customer move tablespace encrypted_customer ;将表移动到新表空间。4索引需要重建,例如:
alter table tde_table1_index1 rebuild tablespace encryptedtbs;5将表从加密的表空间move到普通表空间,就完成了解密。11g表空间级透明数据加密的功能提升相对于10g版本的列级TDE,表空间级TDE提供了更多的灵活性和更好的性能。下列表格是10g列级TDE和11g 表空间级TDE的比较。
 列级TDE表空间级TDE
加密完成在PGAData Block 层
在SGA中加密数据的状态加密的解密的
支持的索引类型只支持b-tree索引支持所有类型索引
支持外键?不知道外键加密(因为不同的表用不通的key)支持外键
支持的索引search方式支持等值search,不知道范围扫描支持所有类型的search
支持的数据类型部分所有
执行计划是否改变可能不改变
是否需要增加存储的占用
对其他产品的支持
  • TDE支持Dataguard,
  • TDE不支持传统导出导入exp/imp
  • TDE支持expdp/impdp,可以直接导出,但是会提示ORA-39173 encryptd data has been stored unencrypted in dump file set ,表时是明文方式存储在DUMP文件中,可以直接导入。
为了保证导出DUMP的安全也可以在导出时使用 ENCRYPTION_PASSWORD参数来对备份文件设置加密口令,导入时只有提供口令密码才能导入数据。更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12本文永久更新链接地址