暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

数据脱敏(Data Redaction)

原创 张超 2026-03-30
24

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 新增
JSONJSON 字段脱敏🔥 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脱敏仅作用于 SELECTINSERT/UPDATE/DELETE 不受影响
LOB 限制CLOB/BLOB 不支持脱敏(但 JSON 类型支持)
应用兼容性应用需能处理脱敏后的格式(如 ****

✅ 八、23c vs 旧版本对比

表格

能力19c/21c23c
正则脱敏❌ 仅固定位置 完整正则支持
JSON 脱敏❌ 需转关系表 原生 JSON 路径脱敏
策略管理多策略分散✅ 策略链简化
性能中等✅ 优化正则引擎
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论