Oracle 透明数据加密--列加密

我们所需要做的就是把某列声明成加密的,剩下的全部由Oracle完成。当用户插入或者更新数据时,列值会被截获、加密,然后用加密后的格式保存。然后,当这一列被查询时,又会自动对列值进行解密,然后把解密后的文本(明文)返回给用户。用户甚至都不需要知道发生过加密和解密——也就是所谓的透明。全部都是由Oracle代码内部完成,不需要任何触发器或者复杂的过程逻辑。


TDE的目的:用最小的代价加密敏感数据,避免可能的对数据文件的盗窃带来的破坏。不过,注意,强调的重点是透明——也就是说,加密是自动进行的,解密也一样。在数据库中。Oracle不会区分用户。当一个用户具有查询对象的权限时,Oracle都会明文给出数据值
TDE总共有三层加密,第一层,wallet密钥的验证密码,这个值是人工设置的密码,第二层wallet密钥,第三层,表密钥,所以只要任何一层没被窃取,你的数据都是相对安全的。

加密解密过程
Oracle 透明数据加密--列加密_第1张图片


使用限制:
1.不能在主键,外键列使用TDE
2.对于使用了TDE的列我们只能创建b树索引。
3.大对象数据类型不可以使用,BLOB,CLOB
4.import/export
5.其他直接访问数据库数据文件的工具不可以使用

支持的加密算法:
Algorithm Key Size Parameter Name

Triple DES (Data Encryption Standard)

168 bits

3DES168

AES (Advanced Encryption Standard)

128 bits

AES128

AES

192 bits (default)

AES192

AES

256 bits

AES256

支持加密的数据类型

  • 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

参考命令说明


Task SQL Command

Add encrypted column to existing table

ALTER TABLE table_name ADD (column_name datatypeENCRYPT);

Create table and encrypt column

CREATE TABLE <table_name> (column_name datatypeENCRYPT);

Encrypt unencrypted existing column

ALTER TABLE table_name MODIFY (column_name ENCRYPT);

Master key: set or reset

ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY <password>;

Master key: set or reset to use PKI certificate

ALTER SYSTEM SET ENCRYPTION KEY <certificate_ID>IDENTIFIED BY <password>;

Wallet: open to access master keys

ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY <password>;


举例:
系统创建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









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