Oracle 数据库数据加密

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(结果):**所有敏感数据表空间完成加密。即使数据文件被拷贝也无法解密。通过信息安全团队验收。

相关推荐
摇滚侠1 小时前
MySQL 面试题 真正的 offer 偏方 Java 基础 Java 高级
java·数据库·mysql
码上有光1 小时前
MySQL的基础操作——约束(上)——期末快速复习
数据库·mysql·期末复习
無限進步D1 小时前
MySQL 运算符
数据库·mysql
2401_867623981 小时前
JavaScript中Number-isSafeInteger的校验逻辑
jvm·数据库·python
oddsand11 小时前
原理篇-Redis数据结构
数据库·redis·缓存
昆曲之源_娄江河畔1 小时前
SQL2000记录行锁定
数据库·sql2000·记录行锁定·更新锁定
Anastasiozzzz2 小时前
万字深度实战!AI Agent 接入万物的底层密码:MCP 协议传输机制与开发指南(下篇)
java·开发语言·数据库·人工智能·ai·架构
WL_Aurora2 小时前
MySQL 目录结构全解析
数据库·mysql
Languorous.2 小时前
SQL新手高频语法错误:分号遗漏、字段名写错,避坑合集
数据库·sql