欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-09 22:41:51
...

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


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

加密解密过程
Oracle 透明数据加密--列加密


使用限制:
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