• 【12c】Oracle 12c Transparent Data Encryption透明数据加密


    对于数据库的安全性而言,除了使用用户、权限和角色进行控制外,还可以通过数据加密或者数据掩码来实现,关于透明的数据加密,可以对个别表列或整个表空间进行加密。当用户向加密的列中插入数据时,透明数据加密会自动加密该数据。当用户选择该列时,数据将自动解密。选择完毕后,数据将重新加密。

    本篇就Oracle 12c中的透明数据加密进行演示。

    1 演示环境

    SQL> select * from v$version;
    
    
    
    BANNER CON_ID
    
    -------------------------------------------------------------------------------- ----------
    
    Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production 0
    
    PL/SQL Release 12.1.0.2.0 - Production 0
    
    CORE 12.1.0.2.0 Production 0
    
    TNS for Linux: Version 12.1.0.2.0 - Production 0
    
    NLSRTL Version 12.1.0.2.0 - Production 0

    2 配置透明的数据加密

    1)查看数据库兼容性

    如果希望配置完整的表空间加密特性,则必须将数据库的compatible初始化参数设置为11.2.0.0或更高。

    SQL> show parameter compatible
    
    
    
    NAME TYPE VALUE
    
    ------------------------------------ ----------- ------------------------------
    
    compatible string 12.1.0.2.0

    2)创建基于密码的软件密钥库

    创建密钥库,需要使用administer key management SQL语句,对应的密钥库目录必须存在,否则出错。

    SQL> administer key management create keystore '/u01/app/oracle/admin/ORCL/wallet' identified by system;
    
    
    
    keystore altered.

    3)打开(关闭)密钥库

    在创建基于密码的软件密钥库之后,如果要使用,必须手动打开它。

    SQL> administer key management set keystore open identified by system;
    
    
    
    keystore altered.

    如果不需要加密了,可以使用以下命令将密钥库关闭:

    administer key management set keystore close identified by system;

    4)创建主加密密钥

    主加密密钥存储在密钥存储库中,用于保护表密钥和表空间加密密钥。默认情况下,主加密密钥是由透明数据加密生成的随机密钥。

    SQL> administer key management set key identified by system with backup using 'passwd key backup';
    
    
    
    keystore altered.

    5)查看密钥状态

    SQL> select * from v$encryption_wallet;
    
    
    
    WRL_TYPE WRL_PARAMETER STATUS WALLET_TYP WALLET_OR FULLY_BAC CON_ID
    
    ---------- ---------------------------------------- ---------- ---------- --------- --------- ----------
    
    FILE /u01/app/oracle/admin/ORCL/wallet OPEN PASSWORD SINGLE NO 0

    3 加密数据(命令行方式)

    配置好透明数据加密之后,就可以对表中的列或表空间进行加密了,可以使用Oracle Cloud Control进行加密,也可以使用命令行进行加密。

    3.1 加密表中的列

    TDE列加密概览:

    3.1.1 支持的数据类型

    TDE列加密支持以下数据类型:

    • BINARY_DOUBLE
    • BINARY_FLOAT
    • CHAR
    • DATE
    • INTERVAL DAY TO SECOND
    • INTERVAL YEAR TO MONTH
    • NCHAR
    • NUMBER
    • NVARCHAR2
    • RAW
    • TIMESTAMP
    • VARCHAR2

    TDE是在SQL层对数据进行加密的,如果使用数据库工具绕过了SQL层,那么就不能使用TDE对数据进行加密了,同时,TDE不能对外键进行加密。

    3.1.2 加密表中的列

    1)创建新表时对列加密(使用默认算法)

    默认情况下,TDE使用AES加密算法进行加密,密钥长度为192字节,即AES192。如果没指定加密列的算法,默认使用AES192。

    SQL> create table student(
    
    2 id number,
    
    3 first_name varchar2(20),
    
    4 last_name varchar2(20),
    
    5 phone varchar2(15) encrypt);
    
    Table created.

    该示例对phone进行加密,使用默认算法AES192,并且SALT和MAC均是默认值。SALT是加密前在给定的字段加的长度为16的随机字符串,用于防破解,而MAC是TDE加的消息认证代码,用于完整性检查。

    SQL> desc student;
    
    Name Null? Type
    
    ----------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------
    
    ID NUMBER
    
    FIRST_NAME VARCHAR2(20)
    
    LAST_NAME VARCHAR2(20)
    
    PHONE VARCHAR2(15) ENCRYPT

    2)创建新表时对列加密(不使用默认算法)

    如果创建表时,指定列不使用默认算法,需通过ENCRYPT USING字句,非默认算法包括:3DES168、AES128、AES256。

    SQL> create table employee(
    
    2 id number encrypt no salt,
    
    3 first_name varchar2(20),
    
    4 last_name varchar2(20),
    
    5 salary number(6) encrypt using '3DES168');
    
    
    
    Table created.

    3)在已存在的表新增加密列

    SQL> alter table student add id_card varchar2(20) encrypt;
    
    
    
    Table altered.

    4)加密表中未加密的列

    SQL> alter table student modify first_name encrypt;
    
    
    
    Table altered.

    5)对表中的列禁用加密

    SQL> alter table student modify first_name decrypt;
    
    
    
    Table altered.

    6)测试TDE加密

    --创建测试数据
    
    SQL> insert into student values(1,'Alen','Liu','110','123454');
    
    
    
    1 row created.
    
    
    
    SQL> commit;
    
    
    
    Commit complete.
    
    --查看TDE密钥状态及位置,目前是打开状态
    
    SQL> select wrl_parameter,status,wallet_type from v$encryption_wallet;
    
    
    
    WRL_PARAMETER STATUS WALLET_TYP
    
    ---------------------------------------- ---------- ----------
    
    /u01/app/oracle/admin/ORCL/wallet OPEN PASSWORD
    
    --查看数据可以看到
    
    SQL> select * from scott.student;
    
    
    
    ID FIRST_NAME LAST_NAME PHONE ID_CARD
    
    ---------- -------------------- -------------------- --------------- --------------------
    
    1 Alen Liu 110 123454
    
    --关闭TDE密钥
    
    SQL> administer key management set keystore close identified by system;
    
    
    
    keystore altered.
    
    
    
    SQL> select wrl_parameter,status,wallet_type from v$encryption_wallet;
    
    
    
    WRL_PARAMETER STATUS WALLET_TYP
    
    ---------------------------------------- ---------- ----------
    
    /u01/app/oracle/admin/ORCL/wallet CLOSED UNKNOWN
    
    --执行查询,出错,提示密钥库未打开
    
    SQL> select * from scott.student;
    
    select * from scott.student
    
    *
    
    ERROR at line 1:
    
    ORA-28365: wallet is not open
    
    SQL> select id,first_name,last_name from scott.student;
    
    
    
    ID FIRST_NAME LAST_NAME
    
    ---------- -------------------- --------------------
    
    1 Alen Liu

    可以看到,当密钥存储库关闭时,加密列不可访问,但未加密的字段可以正常访问。

    3.2 加密表空间

    TDE表空间加密概览:

    对于表空间的加密,加密算法默认时AES128。

    1)加密表空间(使用默认算法)

    SQL> create tablespace testdata datafile '/u01/app/oracle/oradata/ORCL/testdata01.dbf' size 100m encryption default storage(encrypt);
    
    
    
    Tablespace created.

    2)加密表空间(使用非默认算法)

    SQL> create tablespace studata datafile '/u01/app/oracle/oradata/ORCL/studata01.dbf' size 100m encryption using 'AES256' default storage(encrypt);
    
    
    
    Tablespace created.
    
    
    
    SQL> col tablespace_name for a30
    
    SQL> select tablespace_name,encrypted from dba_tablespaces where tablespace_name='STUDATA';
    
    
    
    TABLESPACE_NAME ENC
    
    ------------------------------ ---
    
    STUDATA YES

    3)移动表至加密表空间中

    SQL> alter table emp_new move tablespace testdata;
    
    
    
    Table altered.

    4 加密数据(Cloud Control方式)

    4.1 加密表中的列

    1)打开Cloud Control,访问数据库主页

    2)输入口令,点击登录

    3)这里我使用已创建的表作为示例,如果新增表,点击创建即可

    4)点击编辑

    5)选择加密的列,如果更改加密算法,点击加密选项更改即可,点击应用

    6)点击链接,可以查看执行结果

    7)执行成功,点击确定

    8)查看加密的列

    4.2 加密表空间

    1)打开Cloud Control,访问数据库主页

    2)点击创建

    3)输入表空间名称,点击添加

    4)输入文件名,点击继续

    5)勾选加密,如果更改加密算法,点击加密选项,在弹出的页面选择对应的加密算法

    6)创建成功

    5 TDE相关的数据字典视图

    5.1 v$wallet

    该数据字典视图显示TDE的主加密密钥信息。

    5.2 v$encryption_wallet

    该视图展示了TDE的密钥库和密钥的位置信息。

    5.3 v$encryption_keys

    该视图展示了TDE主加密密钥信息。

    5.4 v$encrypted_tablespaces

    该视图展示了加密的表空间信息。

    5.5 dba_encrypted_columns / all_encrypted_columns / user_encrypted_columns

    该视图展示了已加密的表中的列的信息。

  • 相关阅读:
    oracle插入数据
    保存图片
    ASCII码排序及md5加密
    JavaScript
    HTML
    py访问Redis和zk操作
    Zookeeper集群搭建以及python操作zk
    并发编程
    Python之socket(套接字)
    Python 网络编程
  • 原文地址:https://www.cnblogs.com/alen-liu-sz/p/12975541.html
Copyright © 2020-2023  润新知