Oracle Database 23c 对 数据脱敏(Data Redaction) 功能进行了重要增强,使其更灵活、更安全、更易用。数据脱敏是 Oracle Advanced Security 选件的核心能力之一,用于在查询时动态隐藏敏感数据(如身份证号、银行卡号、手机号),而无需修改底层存储,适用于开发测试、外包访问、合规审计等场景。
🔒 一、核心原理
- 动态脱敏:数据在返回给客户端前实时遮蔽,原始数据在数据库中保持完整。
- 基于策略:通过
DBMS_REDACT包定义脱敏规则。 - 权限驱动:仅对无豁免权限的用户生效(如普通应用用户),DBA 或特权用户可看到明文。
✅ 优势:零应用改造、不影响索引/统计信息、满足 GDPR/CCPA/等保要求。
🆕 二、23c 新增关键特性
1. 部分脱敏支持正则表达式(Regular Expressions)
痛点解决:旧版本只能按固定位置脱敏(如“前4后4”),无法处理变长或复杂格式数据。
示例:脱敏中国手机号(11位,保留前3后4)
BEGIN
DBMS_REDACT.ADD_POLICY(
object_schema => 'APP',
object_name => 'CUSTOMERS',
policy_name => 'REDACT_PHONE',
expression => '1=1' -- 对所有行生效
);
DBMS_REDACT.ALTER_POLICY(
object_schema => 'APP',
object_name => 'CUSTOMERS',
policy_name => 'REDACT_PHONE',
action => DBMS_REDACT.ADD_COLUMN,
column_name => 'PHONE',
function_type => DBMS_REDACT.REGEXP, -- ← 23c 关键!
regexp_pattern => '(1[3-9]\d)(\d{4})(\d{4})', -- 匹配手机号
regexp_replace_string => '\1****\3', -- 保留前3后4
regexp_position => 1,
regexp_occurrence => 0
);
END;
/✅ 效果:
- 明文:
13812345678 - 脱敏后:
138****5678
💡 支持任意正则(邮箱、身份证、信用卡号等)。
2. JSON 数据脱敏(Redaction for JSON)
23c 首次支持对 JSON 文档中的字段脱敏,无需解析为关系表。
示例:脱敏 JSON 中的 creditCard 字段
-- 表结构:orders (order_id NUMBER, details JSON)
BEGIN
DBMS_REDACT.ADD_POLICY(
object_schema => 'SALES',
object_name => 'ORDERS',
policy_name => 'REDACT_CC_JSON'
);
DBMS_REDACT.ALTER_POLICY(
object_schema => 'SALES',
object_name => 'ORDERS',
policy_name => 'REDACT_CC_JSON',
action => DBMS_REDACT.ADD_COLUMN,
column_name => 'DETAILS',
function_type => DBMS_REDACT.JSON,
json_path => '$.creditCard', -- ← 指定 JSON 路径
redact_function => DBMS_REDACT.PARTIAL, -- 部分脱敏
partial_redact_char => '*',
partial_redact_from => 1,
partial_redact_to => 12 -- 隐藏前12位
);
END;
/✅ 效果:
{
"customer": "Alice",
"creditCard": "************1234"
}3. 简化策略管理(Policy Chaining)
- 支持在单个策略中定义多列脱敏规则,减少策略数量。
- 语法更简洁,降低运维复杂度。
🧩 三、脱敏类型(Function Types)
表格
| 类型 | 说明 | 23c 增强 |
|---|---|---|
FULL | 完全脱敏(返回 NULL 或固定值) | — |
PARTIAL | 部分脱敏(如 138****5678) | ✅ 支持正则 |
RANDOM | 随机值替换(每次查询不同) | — |
REGEXP | 正则表达式脱敏 | 🔥 23c 新增 |
JSON | JSON 字段脱敏 | 🔥 23c 新增 |
NONE | 不脱敏(用于豁免) | — |
👥 四、典型应用场景
场景 1:开发环境脱敏
- 生产数据脱敏后导入开发库
- 开发者只能看到
138****5678,无法获取真实手机号
场景 2:外包团队访问
- 外包人员连接生产库只读账号
- 敏感字段自动脱敏,无需创建视图
场景 3:GDPR “被遗忘权”辅助
- 在审计日志中脱敏个人标识符
- 满足“数据最小化”原则
场景 4:JSON API 安全
- REST 服务直接查询 JSON 表
- 敏感字段(如密码、密钥)自动遮蔽
⚙️ 五、权限与豁免
1. 默认行为
- 所有用户(除特权用户)均受脱敏策略影响
2. 豁免特权用户
-- 授予 EXEMPT REDACTION POLICY 权限
GRANT EXEMPT REDACTION POLICY TO app_admin;✅
app_admin用户查询将看到明文数据。
3. 基于角色的动态豁免(23c 推荐)
-- 策略表达式:仅对非管理员角色脱敏
expression => 'SYS_CONTEXT(''USERENV'', ''SESSION_USER'') != ''APP_ADMIN'''📊 六、性能与监控
性能影响
- 脱敏在 SQL 执行阶段进行,对简单查询影响 < 5%
- 正则脱敏(
REGEXP)开销较高,建议用于低频查询
监控脱敏活动
-- 查看脱敏策略
SELECT * FROM REDACTION_POLICIES;
-- 查看脱敏列
SELECT * FROM REDACTION_COLUMNS;
-- 审计脱敏操作(需开启审计)
AUDIT POLICY ORA_SECURE_VIEW_REDATION;⚠️ 七、重要限制
| 限制 | 说明 |
|---|---|
| 许可要求 | 需要 Oracle Advanced Security 选件(额外收费) |
| 不适用于 DML | 脱敏仅作用于 SELECT,INSERT/UPDATE/DELETE 不受影响 |
| LOB 限制 | CLOB/BLOB 不支持脱敏(但 JSON 类型支持) |
| 应用兼容性 | 应用需能处理脱敏后的格式(如 ****) |
✅ 八、23c vs 旧版本对比
表格
| 能力 | 19c/21c | 23c |
|---|---|---|
| 正则脱敏 | ❌ 仅固定位置 | ✅ 完整正则支持 |
| JSON 脱敏 | ❌ 需转关系表 | ✅ 原生 JSON 路径脱敏 |
| 策略管理 | 多策略分散 | ✅ 策略链简化 |
| 性能 | 中等 | ✅ 优化正则引擎 |
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




