概述
最近有个需求是需要把某列声明成加密的,剩下的全部由Oracle完成。当用户插入或者更新数据时,列值会被截获、加密,然后用加密后的格式保存。然后,当这一列被查询时,又会自动对列值进行解密,然后把解密后的文本(明文)返回给用户。用户甚至都不需要知道发生过加密和解密——也就是所谓的透明。全部都是由Oracle代码内部完成,不需要任何触发器或者复杂的过程逻辑。
那么,这个怎么实现呢?下面用实例来演示下:
TDE
1、概念
TDE的目的:用最小的代价加密敏感数据,避免可能的对数据文件的盗窃带来的破坏。不过,注意,强调的重点是透明——也就是说,加密是自动进行的,解密也一样。在数据库中。Oracle不会区分用户。当一个用户具有查询对象的权限时,Oracle都会明文给出数据值
TDE总共有三层加密,第一层,wallet密钥的验证密码,这个值是人工设置的密码,第二层wallet密钥,第三层,表密钥,所以只要任何一层没被窃取,你的数据都是相对安全的。
2、使用限制
- 不能在 主键 , 外键 列使用TDE
- 对于使用了TDE的列我们只能创建b树 索引 。
- 大对象数据类型不可以使用, BLOB ,CLOB
- import/ export
- 其他直接访问数据库数据文件的工具不可以使用
3、支持的加密算法
4、支持加密的数据类型
- CHAR
- DATE
- INTERVAL DAY TO SECOND
- INTERVAL YEAR TO MONTH
- NCHAR
- NUMBER
- NVARCHAR2
- RAW
- TIMESTAMP (includes TIMESTAMP WITH TIME ZONE and TIMESTAMP WITH LOCAL TIME ZONE)
- VARCHAR2
5、参考命令说明
实例演示
1、先要创建一个“wallet钱包”,这个钱包里面保存着密钥,Oracle就是通过这个密钥对列进行加密和解密的。
mkdir -p /home/oracle/app/oracle/wallet
2、生成wallet钱包之前先要设定wallet钱包的保存位置
设置wallet钱包位置的文件$ORACLE_HOME/network/admin/ SQL net.ora
ENCRYPTION_WALLET_LOCATION=( SOURCE=( (METHOD=FILE) (METHOD_DATA=(DIRECTORY=/home/oracle/app/oracle/wallet)) ) )
3、数据库里创建wallet并且设置访问密码
alter system set encryption key authenticated by "123456";
4、创建带有加密列的表,插入相关数据
create table scott.en_test (id int,name varchar(20),salary number(10,2) encrypt using 'AES256'); insert into scott.en_test values(1,'hwb',50000.00); insert into scott.en_test values(2,'hwb2',30000.00);
5、设置了密码后可以手动打开或者关闭wallet
打开wallet
alter system set encryption wallet open authenticated by "123456";
关闭wallet
--11g关闭也需要口令 alter system set wallet close identified by "123456";
6、关闭wallet查看加密列
如果有查询权限,不加密的列可以查询,加密的无法查询,必须打开wallet才可以
SQL> alter system set wallet close identified by "123456"; SQL> select wrl_type,wrl_parameter,status from gv$encryption_wallet; SQL> desc scott.en_test; SQL> select id,name from scott.en_test; SQL> select SALARY from scott.en_test;
7、打开wallet,可以正常访问加密列
SQL> alter system set encryption wallet open authenticated by "123456"; SQL> select SALARY from scott.en_test;
8、 数据字典 查看那些列被加密
select * from dba_encrypted_columns;
这个在银行和金融行业还是比较多用到的,大家有空也可以自己测试一下。后面会分享更多devops和DBA方面内容,感兴趣的朋友可以关注下!