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

Oracle 10g R2 Transparent Data Encryption 透明数据加密

程序员文章站 2022-05-15 14:35:26
...

Oracle 10g R2 Transparent Data Encryption 透明数据加密

本章介绍如何使用透明数据加密来保护Oracle数据库中的敏感数据,该功能使您可以加密数据库并管理加***。 本章包含以下主题:

  • 关于透明数据加密

  • 使用透明数据加密

  • 管理透明数据加密

1. 关于透明数据加密

Oracle数据库10g使用身份验证,授权和审核机制来保护数据库中的数据,但不保护存储数据的操作系统文件。 为了保护这些文件,Oracle数据库10g提供了透明的数据加密。 此功能使您可以通过加密来保护存储在操作系统文件中的数据库列中的敏感数据。 然后,为了防止未经授权的解密,它将加***存储在数据库外部的安全模块中。

本节包含以下主题:

  • 使用透明数据加密的好处

  • 何时使用透明数据加密

  • 透明数据加密的工作原理

  • 基本透明数据加密操作概述

1.1 使用透明数据加密的好处

透明数据加密可以对中的敏感数据进行简单,轻松的加密,而无需用户或应用程序来管理加***。 在解决例如法规遵从问题时,这种*非常重要。 无需使用视图来解密数据,因为一旦用户通过必要的访问控制检查,数据就会被透明地解密。 安全管理员可以确保磁盘上的数据已加密,但处理加密数据对应用程序变得透明。

1.2 何时使用透明数据加密

使用透明数据加密来保护信用卡和社会保险号等机密数据,而无需管理**存储或创建辅助表,视图和触发器。 处理敏感数据的应用程序可以使用此功能提供强大的数据加密,只需对应用程序进行很少或不进行任何更改。

但是,不要对这些数据库功能使用透明数据加密:

  • B树以外的索引类型

  • 索引中的范围扫描

  • 大对象数据类型,如BLOB和CLOB

  • exp与imp程序

  • 其他直接访问数据文件的数据库工具和程序

  • 需要使用这些不受支持的功能的应用程序可以使用DBMS_CRYPTO程序包来满足其加密需求。

注意:
对现有表启用加密会导致完整表更新,就像修改表特性的任何其他ALTER TABLE操作一样。 在对大型现有表启用加密之前,管理员应记住对数据库服务器的潜在性能和重做日志影响。

1.3 透明数据加密的工作原理

透明数据加密是一种基于**的访问控制系统。 即使检索到加密数据,在授权解密发生之前也不能**,这对于被授权访问该表的用户是自动的。

当表包含加密列时,无论加密列的数量如何,都使用单个**。 包含加密列的所有表的键都使用数据库服务器主**加密,并存储在数据库的字典表中。 没有**以明文形式存储。

如图1-1所示,服务器的主**存储在数据库外部的外部安全模块中,只能由安全管理员访问。 对于此外部安全模块,Oracle使用本章所述的Oracle wallet。 以这种方式存储主**可防止未经授权的使用。 除了存储主**之外,Oracle wallet 还用于生成加***并执行加密和解密。

图1-1透明数据加密概述
Oracle 10g R2 Transparent Data Encryption 透明数据加密

使用外部安全模块将普通程序功能与加密操作分开,从而可以在数据库管理员和安全管理员之间划分职责。 安全性得到增强,因为没有一个管理员被授予对所有数据的完全访问。

1.4 基本透明数据加密操作概述

要使用透明数据加密,您必须具有ALTER SYSTEM权限和Oracle wallet 的有效密码。 如果Oracle wallet不存在,则使用SQL命令中指定的密码创建新wallet。

要创建新的主**并开始使用透明数据加密,请发出以下命令:

ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY password

此命令生成数据库服务器主加***,服务器使用该**加密每个表的列加***。 在设置服务器的主**之前,不能加密数据库中的表列。

在数据库实例关闭之前,数据库仍可访问已设置的主**。 要在重新启动数据库后加载主**,请使用以下命令:

ALTER SYSTEM SET WALLET OPEN IDENTIFIED BY password

要使用加密列创建新表,请使用以下格式的CREATE TABLE命令:

CREATE TABLE table_name ( column_name column_type ENCRYPT,....);

针对列的ENCRYPT关键字指定应该加密列。

如果现有表具有需要加密的列,请使用以下格式的ALTER TABLE命令:

ALTER TABLE table_name MODIFY ( column_name column_type ENCRYPT,...);

针对列的ENCRYPT关键字指定应该加密列。

要禁用对数据库中所有加密列的访问,请使用以下命令:

ALTER SYSTEM SET WALLET CLOSE

该命令禁用对wallet中主**的访问,并阻止访问加密列中的数据。

2. 使用透明数据加密

配置和使用此功能只需要少量步骤。 本节包含以下主题:
- 启用透明数据加密

  • 打开用于数据库访问加***的加密wallet

  • 设置和重置主**

  • 在加密列中添加或删除Salt

  • 创建包含加密列的表

  • 在现有表中指定加密列

  • 在加密列上创建索引

  • 更改包含加密列的表上的加***或算法

  • 支持的加密和完整性算法

  • 可以使用透明数据加密功能加密的数据类型

  • 快速参考:透明数据加密SQL命令

2.1 启用透明数据加密

在启用透明数据加密之前,数据库的兼容级别必须为10.2。 要开始使用透明数据加密,安全管理员必须创建wallet并设置主**。

wallet可以是与其他Oracle数据库组件共享的默认数据库wallet,也可以是透明数据加密专门使用的单独wallet。 Oracle建议,为了更高的安全性,可以使用单独的wallet来存储透明数据加密主**。

2.2 打开用于数据库访问加***的加密wallet

外部安全模块将加***存储在Oracle wallet中。 数据库必须先将主加***和列加***从 wallet加载到内存中,然后才能加密或解密列。 使用以下ALTER SYSTEM命令显式打开 wallet:

ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY password

其中password是sqlnet.ora中指定的字符串值,作为 wallet的密码。

wallet打开后,它将保持打开状态,直到您关闭数据库实例(或通过发出ALTER SYSTEM SET ENCRYPTION WALLET CLOSE命令显式关闭它)。 重新启动实例时,必须再次发出ALTER SYSTEM SET ENCRYPTION WALLET OPEN命令。

如果schema没有ALTER SYSTEM权限,或者 wallet不可用,或者给出了错误的密码,则该命令将返回错误并退出。 如果 wallet已经打开,该命令将返回错误并且不执行任何操作。 例1-1显示了每个用例的示例。

示例1-1使用ALTER SYSTEM打开外部安全模块wallet

ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "U83j10LLt8v";
Wallet opened.

ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "U83j10LLt8v";
ORA-XXXXX: Wallet already opened.

ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "U93j10LLt8v";
ORA-XXXXX: Incorrect wallet password given.

2.2.2.1 使用自动登录的wallet启用透明数据加密

外部安全模块可以使用启用了自动登录功能的 wallet。 这些 wallet始终保持开放状态。 重新启动数据库实例后,安全管理员不必重新打开 wallet。 如果您的环境不需要必须明确打开使用的 wallet提供的额外安全性,那么您可以使用自动登录 wallet

2.2.2.2 在SQLNET.ORA中指定其他wallet位置

默认情况下,外部安全模块将加***存储在sqlnet.ora配置文件中指定的Oracle wallet中。 如果sqlnet.ora文件中未指定 wallet位置,则使用默认数据库 wallet。

如果您希望专门用于透明数据加密的 wallet,则必须使用ENCRYPTION_WALLET_LOCATION参数在sqlnet.ora中指定第二个 wallet位置。

ENCRYPTION_WALLET_LOCATION = (SOURCE =
                                  (METHOD = FILE)
                                  (METHOD_DATA =
                                  (DIRECTORY =
                                   /oracle/dbsid/admin/pdcs11/wallet)))

2.3 设置和重置主**

主**存储在外部安全模块中,用于保护列加***。默认情况下,主**是由透明数据加密生成的随机**。它也可以是指定用于加密的PKI证书的现有**对。要对PKI**对使用透明数据加密,颁发证书颁发机构必须能够颁发X.509v3证书,并将**用法字段标记为加密。

两种**类型都不安全,但如果您已在单位内部署PKI,则可以利用此类PKI服务作为**托管和恢复。但是,使用当前PKI算法的加密比对称**加密需要更多的系统资源。在访问数据库中的加密列时,使用PKI**对作为主**可能会导致性能下降。

要设置或重置主**,请使用相同的ALTER SYSTEM命令。以下部分说明了执行每个任务的方式和原因。

2.3.1 设置首次使用透明数据加密的主**

在加密任何数据库列之前,必须生成或设置主**。 此主**用于加密在数据库列上使用ENCRYPT子句发出SQL命令时自动生成的列加***。

要设置主**,请使用以下SQL语法:

ALTER SYSTEM SET ENCRYPTION KEY certificate_ID IDENTIFIED BY password

where
- certificate_ID是一个可选字符串,包含存储在安全模块中的证书的唯一标识符。 如果您打算使用PKI私钥作为主**,请使用此参数。 此参数没有默认设置。

  • 您可以在wallet打开时通过查询V$WALLET固定视图来搜索certificate_ID。 仅显示可通过透明数据加密用作主**的证书。

  • password是安全模块的必需wallet密码,没有默认设置。 它区分大小写; 用双引号括起来。

如果不存在 wallet,则此命令在sqlnet.ora参数文件中指定的 wallet位置创建新的 wallet。 如果sqlnet.ora文件中未指定 wallet位置,则使用默认数据库 wallet位置。 如果现有的自动登录 wallet存在于预期的 wallet位置,则不会创建新的 wallet。

2.3.2 重置主**

仅在主**被泄露时才重新生成主**。 频繁的主**重新生成不一定会增强系统安全性。 安全模块可以存储大量但不是无限数量的**,并且频繁的主**重新生成可以耗尽所有可用的存储空间。

要重置主**,请使用SQL语法,如“首次使用透明数据加密设置主**”中所示。

请注意,ALTER SYSTEM SET ENCRYPTION KEY命令是一个需要ALTER SYSTEM权限的DDL命令,它会自动提交任何挂起的事务。 示例1-2显示了此命令的示例用法。

示例1-2设置或重置主**以使用基于PKI的私钥

ALTER SYSTEM SET ENCRYPTION KEY "j23lm781098dhb345sm" IDENTIFIED BY "p3812dH9E";

请注意,对于基于PKI的**,不会强制执行证书吊销列表,因为强制执行证书吊销可能会导致无法访问数据库中的所有加密信息。

2.4 在加密列中添加或删除Salt

Salt是一种加强加密数据安全性的方法。 它是在加密之前添加到数据中的随机字符串,导致重复的文本在加密时显示为不同。 因此,Salt删除了攻击者用来窃取数据的一种方法,即匹配加密文本的模式。

要在加密列中添加或删除salt,请再次使用ALTER TABLE MODIFY命令,并使用ENCRYPT子句指定SALT或NO SALT参数。 例1-3和例1-4说明了这些命令。

示例1-3将Salt添加到加密列

ALTER TABLE employee MODIFY (first_name ENCRYPT SALT);

示例1-4从加密列中删除Salt

ALTER TABLE employee MODIFY (first_name ENCRYPT NO SALT);

要在对创建索引之前从加密列中删除salt,请使用示例1-4中显示的语法。 该命令还重新加密数据。

2.5 创建包含加密列的表

要使用加密列创建关系表,请在使用CREATE TABLE语句定义数据库列时指定SQL ENCRYPT子句。

本节包含以下主题:
- 使用使用默认算法的加密列创建表

  • 使用非默认算法和无SALT创建具有加密列的表

  • 在外部表上创建加密列

2.5.1 使用使用默认算法的加密列创建表

默认情况下,透明数据加密使用具有192位长度**的AES(AES192)。 如果使用ENCRYPT子句而不使用其他修饰符,则使用AES192对指定的列进行加密,如例1-5所示。

示例1-5使用默认算法创建具有加密列的新表(AES192)

CREATE TABLE employee (
     first_name VARCHAR2(128),
     last_name VARCHAR2(128),
     empID NUMBER,
     salary NUMBER(6) ENCRYPT
);

2.5.2 使用非默认算法和无SALT创建具有加密列的表

默认情况下,透明数据加密会在加密前为明文添加salt。 这使得攻击者更难通过暴力攻击窃取数据。

但是,如果您计划索引加密列,则必须使用NO SALT。 示例1-6显示了如何使用SQL ENCRYPT子句(empID NUMBER ENCRYPT NO SALT)指定NO SALT参数。 它还显示了指定不同加密算法的语法(salary NUMBER(6)ENCRYPT USING’3DES168’)。 请注意,指定算法的字符串必须用单引号括起来。

示例1-6使用3DES168和NO SALT创建带有加密列的新表

CREATE TABLE employee (
     first_name VARCHAR2(128),
     last_name VARCHAR2(128),
     empID NUMBER ENCRYPT NO SALT,
     salary NUMBER(6) ENCRYPT USING '3DES168'
);

2.5.3 在外部表上创建加密列

外部表数据库功能使您可以访问外部源中的数据,就像它位于数据库中的表中一样。 可以使用ORACLE_DATAPUMP访问驱动程序更新外部表。 否则,它们是只读的。

要加密外部表中的特定列,请在定义这些列时指定ENCRYPT子句。 该规范使用随机生成的**加密列。

但是,如果您打算移动外部表,则该**将不会在新位置中可用。 对于此类表,您应指定自己的密码来加密列。 然后,在移动数据后,使用相同的密码重新生成**,以便可以在新位置访问加密的列数据。

表分区交换还需要基于密码的列加***。

示例1-7使用密码生成的列**创建新的外部表

CREATE TABLE emp_ext (
     first_name,
     last_name,
     empID,
     salary,
     ssn ENCRYPT IDENTIFIED BY "xIcf3T9u"
)  ORGANIZATION EXTERNAL
   (
    TYPE ORACLE_DATAPUMP
    DEFAULT DIRECTORY "D_DIR"
    LOCATION('emp_ext.dat')
    )
    REJECT LIMIT UNLIMITED
as select * from employee;

2.6 在现有表中指定加密列

要将加密列添加到现有表,或加密或解密现有列,可以使用带有ADD或MODIFY子句的ALTER TABLE SQL命令。

本节包含以下主题:
- 将加密列添加到现有表

  • 加密未加密的列

  • 禁用列上的加密

2.6.1 将加密列添加到现有表

要将加密列添加到现有表,请使用ALTER TABLE ADD命令,使用ENCRYPT子句指定新列,如

ALTER TABLE employee ADD (ssn VARCHAR2(11) ENCRYPT);

此命令使用默认AES加密算法使用192位**长度(AES192)加密新列,并在加密前向明文数据添加salt。 但是,如果计划此列上增加索引,请使用带有NO SALT参数的ENCRYPT子句。 有关此语法的示例,请参阅“从加密列添加或删除Salt”。

2.6.2 加密未加密的列

要加密未加密的列,请使用ALTER TABLE MODIFY命令,使用ENCRYPT子句指定未加密的列,如:

ALTER TABLE employee MODIFY (first_name ENCRYPT);

此命令使用默认的AES192算法对列进行加密,因为未指定其他加密算法。 默认情况下会添加Salt,因为未使用ENCRYPT指定NO SALT参数。

2.6.3 禁用列上的加密

出于兼容性或性能的原因,可能需要禁用加密。 要禁用列加密,请使用带有DECRYPT子句的ALTER TABLE MODIFY命令,如:

ALTER TABLE employee MODIFY (first_name DECRYPT);

2.7 在加密列上创建索引

要在加密列上创建索引,请使用标准CREATE INDEX命令。 被索引的列必须在没有salt的情况下加密。 示例1-11显示了如何在没有salt的情况下加密的列上创建索引。

示例1-11在没有Salt的情况下加密的列上创建索引

CREATE TABLE employee (
   first_name VARCHAR2(128),
   last_name VARCHAR2(128),
   empID NUMBER ENCRYPT NO SALT,
   salary NUMBER(6) ENCRYPT USING '3DES168'
);
CREATE INDEX employee_idx on employee (empID);

【注意】:
您无法在使用salt加密的列上创建索引。 如果您尝试这样做,则会引发错误(ORA-28338)。

2.8 更改包含加密列的表上的加***或算法

每个表的列最多只能有一个加***。 可以使用原始加密算法或REKEY命令短语中指定的其他算法来更改此**。 本节中的示例说明了这些功能。 良好的安全措施包括在此类更改之前和之后备份wallet。

示例1-12更改包含加密列的表的加***

ALTER TABLE employee REKEY;

示例1-13更改包含加密列的表的加***和算法

ALTER TABLE employee REKEY USING '3DES168';

2.9 支持的加密和完整性算法

默认情况下,透明数据加密使用高级加密标准和192位长度密码**(AES192)。 此外,除非另有说明,否则在加密前默认将salt添加到cleartext。 请注意,无法将salt添加到要加密的索引列。 对于索引列,请为SQL ENCRYPT子句选择NO SALT参数。

您可以通过使用SQL ENCRYPT子句设置不同的算法来更改现有加密列上的加密算法和加***。

表1-1支持的透明数据加密加密算法:

算法 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

为了完整性保护,使用SHA-1哈希算法。

2.10 可以使用透明数据加密功能加密的数据类型

  • 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

2.11 快速参考:透明数据加密SQL命令

表1-2提供了可用于实现和管理透明数据加密的SQL命令的摘要。

1-2透明数据加密SQL命令快速参考

Task SQL Command
Add encrypted column to existing table ALTER TABLE table_name ADD (column_name datatype ENCRYPT);
Create table and encrypt column CREATE TABLE (column_name datatype ENCRYPT);
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>;

3. 管理透明数据加密

本节包含以下主题:
- 用于透明数据加密的Oracle wallet管理

  • 备份和恢复主**

  • 导出和导入带有加密列的表

  • 透明数据加密的性能影响

  • 使用透明数据加密的安全注意事项

  • 分布式环境中的透明数据加密和复制

  • 使用OCI进行透明数据加密

  • 透明数据加密数据字典视图

3.1 用于透明数据加密的Oracle wallet管理

要存储主**,透明数据加密可以使用所有Oracle组件共享的默认数据库 wallet或单独的 wallet。 wallet可以是自动启用wallet,允许访问加密数据,而无需安全管理员明确打开 wallet。

3.1.1 创建 Wallets

要创建透明数据加密使用的 wallet,请使用ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY password命令。 如果默认位置或指定位置不存在 wallet,则透明数据加密会在首次设置主**时创建 wallet。 如果sqlnet.ora文件中的WALLET_LOCATION参数未指定有效路径,则不会创建 wallet。 用于设置主**的SQL命令中指定的密码将成为打开 wallet的密码。

除了SQL命令之外,您还可以使用mkwallet命令行实用程序和Oracle Wallet Manager来创建 wallet。 这些功能齐全的工具可让您创建 wallet并查看和修改其内容。

3.1.2 使用自动登陆的wallet

您可以使用mkwallet实用程序或Oracle Wallet Manager创建自动登录 wallet。 自动登录 wallet允许跨数据库实例重新启动方便地访问加密数据。

透明数据加密仅在可用位置正确的情况下使用自动登录 wallet,并且尚未执行打开加密 wallet的SQL命令。 如果正在使用自动登录 wallet,则不得使用通过密码命令识别的ALTER SYSTEM SET ENCRYPTION WALLET OPENET

3.1.3 为透明数据加密指定单独的wallet

默认情况下,透明数据库加密使用sqlnet.ora配置文件中的WALLET_LOCATION参数指定的默认数据库 wallet或 wallet。 由于此 wallet可以由其他Oracle组件共享,因此Oracle建议单独使用一个 wallet来存储透明数据加密使用的主**。 要指定单独的 wallet,请在sqlnet.ora文件中设置ENCRYPTION_WALLET_LOCATION参数,使其指向透明数据加密专用的 wallet。

在确定要使用的 wallet时,透明数据加密首先尝试使用参数ENCRYPTION_WALLET_LOCATION指定的 wallet。 如果未设置参数,或者在指定位置未找到 wallet,则它会尝试使用参数WALLET_LOCATION指定的 wallet。 如果此操作也失败,则透明数据加密会在默认数据库位置查找 wallet。

3.2 备份和恢复主**

本节包含以下主题:

  • Oracle Wallet的备份和恢复

  • PKI**对的备份和恢复

3.2.1 Oracle Wallet的备份和恢复

由于要求主**访问任何加密数据,因此必须正确备份它们。 这意味着,由于主**驻留在Oracle wallet中,因此应定期将 wallet与数据库数据文件一起备份在安全位置。 每当设置新的主**时,您必须备份 wallet的副本。

如果您丢失了存储主**的 wallet,则可以通过将备份版本的 wallet复制到适当的位置来恢复对加密数据的访问。 如果在最后一次重置主**后归档了已恢复的 wallet,则无需执行其他操作。

如果还原的 wallet不包含最新的主**,则可以通过将数据库的状态回滚到该时间点来恢复重置主**时的旧数据。 重置主**后对加密列的所有修改都将丢失。

3.2.2 PKI**对的备份和恢复

透明数据加密支持使用PKI非对称**对作为主**。这使它能够利用领先的证书颁发机构供应商提供的现有**备份,托管和恢复功能。

在当前**托管或恢复系统中,具有**恢复功能的证书颁发机构通常存储私钥的版本或帮助恢复私钥的一条信息。如果私钥丢失,则用户可以通过联系证书颁发机构并启动**恢复过程来恢复原始**和证书。

通常,**恢复过程是自动的,并且要求用户向证书颁发机构提供某些认证凭证。透明数据加密不会对**恢复过程施加任何限制,除了恢复的**及其关联的证书是可以导入Oracle wallet的PKCS#12文件。此要求与主要证书颁发机构的**恢复机制一致。

获取具有原始证书和私钥的PKCS#12文件后,您需要在与前一个 wallet相同的位置创建一个新的空 wallet。为此,您可以使用mkwallet命令行实用程序或Oracle Wallet Manager。然后,您可以使用相同的实用程序将PKCS#12文件导入 wallet。您应该选择一个强密码来保护 wallet。

创建 wallet并导入正确的证书后,登录数据库并在SQL提示符下执行以下命令以完成恢复过程:

ALTER SYSTEM SET ENCRYPTION KEY certificate_id IDENTIFIED BY wallet_password

要检wallet中证书的certificate_id,请在打wallet后查询V$WALLET固定视图。

3.3 导出和导入带有加密列的表

导出包含加密列的表时,重要的是:

  • 在传输过程中,敏感数据是以加密形态传输的

  • 授权用户可以在目标导入数据后解密该数据

由于解***对于表最初所在的服务器是本地的,因此使用该**无法在目标进行解密。 因此,在导出之前,管理员使用密码**重新**表,然后密码**将其安全地提供给目标管理员。

导入后,目标管理员指定相同的密码。 导入的受影响列将被解密,使接收服务器能够使用本地服务器**立即重新加密这些列。 然后,他们就可以在新的位置进行标准授权使用。

3.4 透明数据加密的性能影响

仅当从加密列检索数据或将数据插入加密列时,此功能才会影响性能。即使在包含加密列的表中,对其他列的此类操作也不会降低性能。

总体性能影响取决于加密列的数量及其访问频率。最适合加密的列是包含最敏感数据的列,包括法规要求。

对现有表中的列启用透明数据加密会导致列中所有行的完整表更新,因为它会加密列中存储的所有数据。这可能导致在启用加密时无法访问表。使用联机重定义来启用透明数据加密允许表在加密时可用。

还应记住完整表更新对大型表的重做日志影响。如果在非常大的表上启用透明数据加密,则可能需要增加重做日志大小以适应操作。

3.5 使用透明数据加密的安全注意事项

访问加密列可以是:

  • Public

  • 由标准身份验证和授权过程和策略控制

  • 由可以授予他人访问权限的个人用户控制

透明数据加密的安全考虑因素在更广泛的系统安全领域内运行。安全管理员必须确定要解决的风险级别以及站点维护的数据的敏感程度。必须针对实现可接受保护的替代方法评估成本和收益。在许多情况下,为加密材料提供单独的安全管理员,单独的wallet和受保护的备份过程是有意义的。具有单独的wallet允许自动登录其他Oracle组件,但保留wallet的密码保护,从而实现透明数据加密。

当使用透明数据加密时,其他安全注意事项适用于正常的数据库和网络操作。加密列数据在数据文件,undo日志和redo日志以及系统全局区域(SGA)的buffer cache中保持加密状态。但是,在表达式评估期间,它会被解密,从而使解密数据可以出现在磁盘上的交换文件中,特权操作系统用户可能会看到这些文件。

3.6 分布式环境中的透明数据加密和复制

通常,方法和保护随着完成复制的工具的选择而变化。 SQL*Loader,Dataguard和import/export是启用带有加密列的表的传输方法。 它们依赖于使用精确创建的密码来保护传输过程中的数据。 当数据在接收点重新构建时,标记为加密的列将立即使用新表位置本地的主**重新键入。

使用基于异步SQL的复制时,描述要执行的更新的信息在LOB中编码(但未加密),并且可以保留在延迟队列中一段时间。 在延迟队列中,数据不受保护。 要最大程度地降低此风险,请配置复制,以便加密的表信息不会长时间保留在延迟队列中。

3.7 使用OCI进行透明数据加密

不能使用“Row-shipping”,因为在接收点无法使用该行可用的**。

3.8 透明数据加密数据字典视图

以下三个数据字典视图维护有关用于加密列的加密算法的信息:

  • DBA_ENCRYPTED_COLUMNS

  • ALL_ENCRYPTED_COLUMNS
    显示用于加密特定用户可访问的所有表的列的算法。

  • USER_ENCRYPTED_COLUMNS
    显示用于加密特定用户架构中所有表的列的算法。