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 加密算法
| 算法 | 密钥长度 | 说明 |
|---|---|---|
| AES128 | 128 bit | 默认 |
| AES192 | 192 bit | |
| AES256 | 256 bit | 推荐 |
| 3DES168 | 168 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. 最佳实践
- 生产用表空间加密:性能好、透明
- 敏感列用列级加密:精细控制
- Wallet 安全:限制权限、备份
- 自动登录 Wallet:避免启动问题
- 定期轮换 Master Key:安全合规
- 使用 AES256:性能与安全平衡
- 索引列 NO SALT:支持索引
- TDE 与 RMAN 集成:加密备份
- Data Guard 同步 Wallet:保证恢复
- 审计 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/