Oracle 透明数据加密(TDE)

Oracle 透明数据加密(TDE)

适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

TDE(Transparent Data Encryption,透明数据加密) 是 Oracle 提供的列级/表空间级数据加密机制[1]:

核心特性

  • 透明性:应用无需修改
  • 加密存储:数据文件中数据加密
  • 密钥管理:通过 Wallet/Keystore 管理
  • 支持列级和表空间级加密

典型用途

  • 保护敏感数据(信用卡号、身份证号)
  • 合规要求(PCI-DSS、GDPR)
  • 防止数据文件被盗后的数据泄露

2. TDE 架构

2.1 加密层次

+------------------+
| Master Key       | ← 存储在 Wallet/Keystore
+------------------+


+------------------+
| TDE Table Key    | ← 每表加密密钥
| (per table)      |
+------------------+


+------------------+
| Data in Data File| ← 加密存储
+------------------+

2.2 Wallet/Keystore

# Wallet 路径
$ORACLE_BASE/admin/<db>/wallet/
# 或
$ORACLE_HOME/network/admin/wallet/

# 文件
ewallet.p12  # PKCS12 格式
cwallet.sso  # 自动登录版本

3. 配置 TDE

3.1 创建 Wallet

-- 1. 设置 Wallet 位置(sqlnet.ora)
-- ENCRYPTION_WALLET_LOCATION=
--   (SOURCE=(METHOD=FILE)(METHOD_DATA=
--     (DIRECTORY=/u01/app/oracle/admin/orcl/wallet)))

-- 2. 创建 Wallet
ADMINISTER KEY MANAGEMENT 
  CREATE KEYSTORE '/u01/app/oracle/admin/orcl/wallet'
  IDENTIFIED BY ******

-- 3. 打开 Wallet
ADMINISTER KEY MANAGEMENT 
  SET KEYSTORE OPEN 
  IDENTIFIED BY ******

-- 4. 设置 Master Key
ADMINISTER KEY MANAGEMENT 
  SET KEY 
  IDENTIFIED BY ****** 
  WITH BACKUP USING 'init_key';

-- 5. 验证
SELECT status FROM v$encryption_wallet;
-- STATUS = OPEN

3.2 自动登录 Wallet

-- 创建 Auto-Login Wallet
ADMINISTER KEY MANAGEMENT 
  CREATE AUTO_LOGIN KEYSTORE 
  FROM KEYSTORE '/u01/app/oracle/admin/orcl/wallet'
  IDENTIFIED BY ******

-- 数据库重启后自动打开 Wallet

4. 列级加密

4.1 加密列

-- 创建表时加密
CREATE TABLE employees (
  id NUMBER,
  name VARCHAR2(100),
  ssn VARCHAR2(11) ENCRYPT USING 'AES256',
  credit_card VARCHAR2(20) ENCRYPT USING 'AES256' NO SALT
);

-- 修改现有表
ALTER TABLE employees MODIFY (
  ssn ENCRYPT USING 'AES256'
);

-- 添加加密列
ALTER TABLE employees ADD (
  salary NUMBER ENCRYPT USING 'AES256'
);

4.2 加密算法

算法密钥长度说明
AES128128 bit默认
AES192192 bit
AES256256 bit推荐
3DES168168 bit旧版

4.3 SALT 选项

-- SALT(默认):随机数防止模式识别
ssn ENCRYPT USING 'AES256' SALT

-- NO SALT:可用于索引列
ssn ENCRYPT USING 'AES256' NO SALT

4.4 索引加密列

-- NO SALT 才能创建索引
ALTER TABLE employees MODIFY (
  ssn ENCRYPT USING 'AES256' NO SALT
);
CREATE INDEX idx_emp_ssn ON employees(ssn);

5. 表空间加密

5.1 创建加密表空间

-- 创建加密表空间
CREATE TABLESPACE secure_ts 
  DATAFILE '/u01/oradata/orcl/secure_ts_01.dbf' SIZE 1G
  ENCRYPTION USING 'AES256'
  DEFAULT STORAGE (ENCRYPT);

-- 查看加密表空间
SELECT tablespace_name, encrypted 
FROM dba_tablespaces 
WHERE encrypted='YES';

5.2 移动表到加密表空间

-- MOVE 表
ALTER TABLE employees MOVE TABLESPACE secure_ts;

-- 重建索引
ALTER INDEX idx_emp_id REBUILD TABLESPACE secure_ts;

5.3 优势

  • 全表加密:所有列加密
  • 性能好:仅 I/O 时加密/解密
  • 应用透明:无需修改 SQL
  • 支持所有数据类型

6. TDE 管理

6.1 查看加密信息

-- 列加密
SELECT 
  table_name, 
  column_name, 
  encryption_alg, 
  salt
FROM dba_encrypted_columns;

-- 表空间加密
SELECT 
  tablespace_name, 
  encryption_alg, 
  encrypted
FROM dba_tablespaces 
WHERE encrypted='YES';

-- Wallet 状态
SELECT status, wallet_type, wallet_order 
FROM v$encryption_wallet;

6.2 密钥管理

-- 查看密钥
SELECT key_id, key_use, activation_time 
FROM v$encryption_keys;

-- 轮换 Master Key
ADMINISTER KEY MANAGEMENT 
  SET KEY 
  IDENTIFIED BY ****** 
  WITH BACKUP USING 'key_rotation';

-- 导出密钥
ADMINISTER KEY MANAGEMENT 
  EXPORT KEYS 
  WITH SECRET "export_secret" 
  TO '/tmp/keys_export.p12' 
  IDENTIFIED BY ******

6.3 Wallet 操作

-- 关闭 Wallet
ADMINISTER KEY MANAGEMENT 
  SET KEYSTORE CLOSE 
  IDENTIFIED BY ******

-- 打开 Wallet
ADMINISTER KEY MANAGEMENT 
  SET KEYSTORE OPEN 
  IDENTIFIED BY ******

-- 备份 Wallet
ADMINISTER KEY MANAGEMENT 
  BACKUP KEYSTORE 
  IDENTIFIED BY ****** 
  TO '/tmp/wallet_backup';

7. TDE 与 RMAN

7.1 加密备份

-- 使用 TDE 加密 RMAN 备份
RMAN> CONFIGURE ENCRYPTION FOR DATABASE ON;
RMAN> BACKUP DATABASE PLUS ARCHIVELOG;

7.2 恢复时需要 Wallet

  • Wallet 必须打开
  • Master Key 必须可访问
  • 否则无法解密备份

8. TDE 与 Data Guard

8.1 主备库 Wallet 同步

# 主库 Wallet 复制到备库
scp /u01/app/oracle/admin/orcl_pri/wallet/ewallet.p12 
    standby:/u01/app/oracle/admin/orcl_std/wallet/

8.2 不同 Master Key(推荐)

-- 主备库使用不同 Master Key(19c+)
ADMINISTER KEY MANAGEMENT 
  SET KEY 
  IDENTIFIED BY ****** 
  WITH BACKUP USING 'dg_key'
  CONTAINER=ALL;

9. 性能影响

9.1 加密开销

  • CPU 开销:加密/解密消耗 CPU
  • I/O 开销:少量(块加密)
  • 总体:1-5% 性能损失

9.2 优化建议

  • 使用 AES-NI CPU 指令
  • 表空间加密优于列加密
  • 索引列用 NO SALT
  • 合理选择加密算法

10. 常见坑与排错

10.1 ORA-28365: wallet is not open

现象:查询加密列报错。

修复

-- 1. 检查 Wallet 状态
SELECT status FROM v$encryption_wallet;

-- 2. 打开 Wallet
ADMINISTER KEY MANAGEMENT 
  SET KEYSTORE OPEN 
  IDENTIFIED BY ******

-- 3. 配置自动登录
ADMINISTER KEY MANAGEMENT 
  CREATE AUTO_LOGIN KEYSTORE 
  FROM KEYSTORE '/path/to/wallet'
  IDENTIFIED BY ******

10.2 ORA-28362: master key not found

现象:Wallet 中找不到 Master Key。

修复

-- 1. 检查密钥
SELECT key_id, key_use FROM v$encryption_keys;

-- 2. 重新设置 Master Key
ADMINISTER KEY MANAGEMENT 
  SET KEY 
  IDENTIFIED BY ****** 
  WITH BACKUP USING 'reinit';

10.3 Wallet 文件丢失

现象:Wallet 文件被删除。

修复

# 1. 从备份恢复 Wallet
cp /backup/wallet.p12 /u01/app/oracle/admin/orcl/wallet/

# 2. 打开 Wallet
sqlplus / as sysdba
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY ******

10.4 索引列加密失败

现象ORA-28338: Column(s) cannot be both indexed and encrypted with salt

修复

-- 索引列必须 NO SALT
ALTER TABLE employees MODIFY (
  ssn ENCRYPT USING 'AES256' NO SALT
);

10.5 表空间加密后性能下降

修复

  • 使用 AES 算法(性能好)
  • 启用 CPU AES-NI
  • 监控 CPU 使用率
  • 考虑部分表空间加密

11. 最佳实践

  1. 生产用表空间加密:性能好、透明
  2. 敏感列用列级加密:精细控制
  3. Wallet 安全:限制权限、备份
  4. 自动登录 Wallet:避免启动问题
  5. 定期轮换 Master Key:安全合规
  6. 使用 AES256:性能与安全平衡
  7. 索引列 NO SALT:支持索引
  8. TDE 与 RMAN 集成:加密备份
  9. Data Guard 同步 Wallet:保证恢复
  10. 审计 Wallet 操作:合规要求

12. 参考资料

[1] Oracle Database Advanced Security Guide 19c, “Transparent Data Encryption” https://docs.oracle.com/en/database/oracle/oracle-database/19/asoag/

[2] Oracle Database Administrator’s Guide 19c, “Managing TDE” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/