1.1、TDE 透明数据加密
TDE (Transparent Data Encryption,透明数据加密) 是 Oracle 数据库提供的 ** 静态数据加密 (Data-at-Rest Encryption)** 技术,自 10gR2 版本引入,旨在保护存储在磁盘、备份磁带等介质上的数据文件,防止物理存储设备被盗或数据文件被非法直接访问时的数据泄露。
1.1.1、核心概念与 "透明" 含义
TDE 的核心机制是:
- 数据写入磁盘前自动加密
- 数据读取到内存时自动解密
- 整个过程对 SQL 引擎、应用程序和授权用户完全透明
"透明" 具体体现在:
- 应用程序无需任何代码修改,继续使用标准 SQL 查询
- 授权用户正常访问数据,看不到加密过程
- 数据库管理系统自动处理所有加密操作
- 不影响索引效率,不改变 DBA 日常运维习惯
1.1.2、两层密钥体系架构
TDE 采用分层密钥管理系统来平衡安全性和性能,这是其最核心的设计:
第一层:主加密密钥 (Master Encryption Key)
- 整个 TDE 密钥体系的根密钥
- 用于加密 / 解密第二层的表密钥或表空间密钥
- 存储在数据库外部的安全模块中 (如 Oracle Wallet、Oracle Key Vault、HSM 硬件安全模块或 OCI KMS)Oracle
- 可以根据安全策略定期轮换,且轮换时无需重新加密所有数据
第二层:数据加密密钥
- 表密钥 (Table Key):用于列级加密,每个包含加密列的表有一个表密钥,存储在数据字典中
- 表空间密钥 (Tablespace Key):用于表空间加密,每个加密表空间有一个表空间密钥,存储在对应数据文件的头部
- 这些密钥使用主密钥加密后存储,只有当主密钥可用时才能被解密使用
1.1.3、两种主要加密类型
Oracle TDE 提供两种加密粒度,满足不同场景需求:
1. 表空间加密 (TDE Tablespace Encryption)
- Oracle 推荐使用的方式
- 加密整个表空间,其中创建的所有对象 (表、索引、LOB 等) 都会自动加密
- 利用批量加密和缓存技术,性能开销更低 (约 5%-8%)
- 支持加密重做日志、归档日志和 RMAN 备份
- 适用于表中多个列包含敏感数据,或需要保护整个表的场景
2. 列级加密 (TDE Column Encryption)
- 仅加密表中的特定敏感列 (如信用卡号、身份证号)
- 灵活性高,但管理开销大
- 对索引列加密时需要使用
NO SALT参数,会降低安全性 - 主要用于遗留系统或特定合规需求
1.1.4、主要优势
- 防止物理数据泄露:即使硬盘被盗或备份磁带丢失,没有主密钥也无法读取数据Oracle
- 满足合规要求:帮助满足 PCI DSS、GDPR、《数据安全法》、《个人信息保护法》等法规的加密要求
- 应用零修改:无需更改应用程序代码,降低实施成本和风险
- 全面数据保护:加密数据文件、重做日志、归档日志和备份文件
- 与 Oracle 生态系统无缝集成:支持 RMAN、Data Pump、Data Guard、多租户架构等
1.1.5、局限性与注意事项
- 仅保护静态数据:无法防御内存攻击、SQL 注入或越权查询,数据在内存中是明文形式
- 性能开销:加解密过程会占用 CPU 资源,尤其在大表扫描或 LOB 字段操作时影响明显
- 密钥管理至关重要:如果主密钥丢失,所有加密数据将永久无法恢复
- 表空间密钥不可轮换:只能通过将数据移动到新的加密表空间来间接更换
- 原生不支持国密算法:不符合国内信创和等保对国密算法的要求
1.2、表空间级加密(推荐)
sql
-- Step 1: 创建 Keystore 目录
-- mkdir -p /u01/app/oracle/wallet
-- Step 2: 创建 Keystore(12c+ 使用 Keystore 替代 Wallet)
ADMINISTER KEY MANAGEMENT CREATE KEYSTORE
'/u01/app/oracle/wallet'
IDENTIFIED BY "Keystore!Pass#2026";
-- Step 3: 打开 Keystore
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN
IDENTIFIED BY "Keystore!Pass#2026";
-- Step 4: 创建主加密密钥
ADMINISTER KEY MANAGEMENT SET KEY
IDENTIFIED BY "Keystore!Pass#2026"
WITH BACKUP USING 'backup_20260516';
-- Step 5: 验证 Keystore 状态
SELECT * FROM V$ENCRYPTION_WALLET;
-- Step 6: 创建加密表空间
CREATE TABLESPACE secure_ts
DATAFILE '/u01/oradata/secure_ts01.dbf' SIZE 10G
ENCRYPTION USING 'AES256'
DEFAULT STORAGE(ENCRYPT);
-- Step 7: 迁移业务表到加密表空间
ALTER TABLE hr.employees MOVE TABLESPACE secure_ts;
ALTER TABLE hr.departments MOVE TABLESPACE secure_ts;
-- 验证加密状态
SELECT TABLESPACE_NAME, ENCRYPTED FROM DBA_TABLESPACES;
-- 查看加密算法
SELECT * FROM V$ENCRYPTED_TABLESPACES;
1.3、列级加密
sql
-- 列级加密(适用于少量敏感列)
ALTER TABLE hr.employees ADD (ssn_enc RAW(200));
UPDATE hr.employees
SET ssn_enc = DBMS_CRYPTO.ENCRYPT(
UTL_RAW.CAST_TO_RAW(ssn),
DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5,
HEXTORAW('0123456789ABCDEF0123456789ABCDEF')
);
-- 注意:列级加密后不能直接索引,需要使用 TDE 列加密
-- TDE 列加密(透明,支持索引)
ALTER TABLE hr.employees MODIFY (ssn ENCRYPT USING 'AES256');
-- 查看加密列
SELECT OWNER, TABLE_NAME, COLUMN_NAME, ENCRYPTION_ALG
FROM DBA_ENCRYPTED_COLUMNS;
实例:数据文件泄露防护------TDE 全库加密
**S --- Situation(场景):**企业数据库服务器硬盘送修时可能被拷贝数据文件,数据文件是明文存储的。
**T --- Task(任务):**对所有敏感表空间启用 TDE 加密。
A --- Action(行动):
1、创建 Keystore 并配置自动登录;
2、创建加密表空间,使用 AES256;
3、将业务表迁移到加密表空间;
4、配置密钥定期轮换策略。
**R --- Result(结果):**所有敏感数据表空间完成加密。即使数据文件被拷贝也无法解密。通过信息安全团队验收。