Oracle 透明数据加密--列加密
TDE的目的:用最小的代价加密敏感数据,避免可能的对数据文件的盗窃带来的破坏。不过,注意,强调的重点是透明——也就是说,加密是自动进行的,解密也一样。在数据库中。Oracle不会区分用户。当一个用户具有查询对象的权限时,Oracle都会明文给出数据值
TDE总共有三层加密,第一层,wallet**的验证密码,这个值是人工设置的密码,第二层wallet**,第三层,表**,所以只要任何一层没被窃取,你的数据都是相对安全的。
使用限制:
1.不能在主键,外键列使用TDE
2.对于使用了TDE的列我们只能创建b树索引。
3.大对象数据类型不可以使用,BLOB,CLOB
4.import/export
5.其他直接访问数据库数据文件的工具不可以使用
Algorithm | Key Size | Parameter Name |
---|---|---|
Triple DES (Data Encryption Standard) |
168 bits |
|
AES (Advanced Encryption Standard) |
128 bits |
|
AES |
192 bits (default) |
|
AES |
256 bits |
|
支持加密的数据类型
CHAR
DATE
INTERVAL DAY TO SECOND
INTERVAL YEAR TO MONTH
NCHAR
NUMBER
NVARCHAR2
RAW
TIMESTAMP
(includesTIMESTAMP WITH TIME ZONE
andTIMESTAMP WITH LOCAL TIME ZONE
)VARCHAR2
Task | SQL Command |
---|---|
Add encrypted column to existing table |
|
Create table and encrypt column |
|
Encrypt unencrypted existing column |
|
Master key: set or reset |
|
Master key: set or reset to use PKI certificate |
|
Wallet: open to access master keys |
|
举例:
系统创建wallet目录,指定wallet位置
mkdir -p /opt/oracle/admin/skydb/wallet
修改sqlnet.ora加入以下内容
ENRYPTION_WALLET_LOCATION =(SOURCE=(METHOD=file)METHOD_DATA=(DIRECTORY=/opt/oracle/admin/skydb/wallet))
数据库里创建wallet并且设置访问密码
alter system set encryption key authenticated by "123456";
创建带有加密列的表,插入相关数据
create table en_tab (id int,name varchar(20),salary number(10,2) encrypt using 'AES256');
insert into en_tab values(1,'dabing',50000.00);
insert into en_tab values(2,'newboy',50000.00);
设置了密码后可以手动打开或者关闭wallet
打开wallet
alter system set encryption wallet open authenticated by "123456";
关闭wallet
alter system set encryption wallet close;
如果有查询权限,不加密的列可以查询,加密的无法查询,必须打开wallet才可以
SQL> desc hank.en_tab;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER(38)
NAME VARCHAR2(20)
SALARY NUMBER(10,2) ENCRYPT
SQL> select id,name from hank.en_tab;
ID NAME
---------- --------------------
1 dabing
2 newboy
SQL> select SALARY from hank.en_tab;
select SALARY from hank.en_tab
*
ERROR at line 1:
ORA-28365: wallet is not open
打开wallet,可以正常访问加密列
SQL> alter system set encryption wallet open authenticated by "123456";
System altered.
SQL> select SALARY from hank.en_tab;
SALARY
----------
50000
50000
只能创建no salt的btree索引
SQL> create index ind_sar on en_tab (salary);
create index ind_sar on en_tab (salary)
*
ERROR at line 1:
ORA-28338: cannot encrypt indexed column(s) with salt
SQL> alter table en_tab modify (salary ENCRYPT NO SALT);
Table altered.
SQL> create index ind_sar on en_tab (salary);
Index created.
可以参看数据字典查看那些列被加密
SQL> select * from user_encrypted_columns;
TABLE_NAME COLUMN_NAME ENCRYPTION_ALG SAL
------------------------------ ------------------------------ ----------------------------- ---
EN_TAB SALARY AES 256 bits key NO
参考:https://docs.oracle.com/cd/B19306_01/network.102/b14268/asotrans.htm#ASOAG600