Oracle如何实现数据脱敏 仅保留字段末尾3位其余用*掩码
Oracle 实现字段保留最后3位脱敏的方案
Oracle 内置了两类能力可直接实现「仅保留字段最后3位有效字符、其余替换为掩码」的需求,无需依赖第三方组件:
- 全版本通用:通过原生字符串函数组合实现,适配所有Oracle版本,灵活度高,适合自定义查询场景
- 12c及以上版本专属:内置
DBMS_REDACT原生数据脱敏包,可配置环境级自动脱敏规则,配置后无需修改业务查询语句,指定账号查询时自动返回脱敏结果
方法一:字符串函数组合实现(全版本兼容)
核心逻辑无需调用特殊包,仅用3个基础内置函数即可完成:
- 用
LENGTH()计算字段总长度,若字段长度≤3则直接返回原值,避免短姓名这类短字段被全量掩码 - 若字段长度>3,用
RPAD()生成和「字段长度-3」数量一致的掩码字符(可按需替换为*、x等任意掩码字符) - 用
SUBSTR(字段名, -3)截取字段最后3位有效值,和前面生成的掩码字符串拼接即可
测试用表结构与初始数据:
create table customer (last_name varchar2(25), first_name varchar2(25), address varchar2(25)); insert into customer values('Doe', 'John', '10 someroad st');
对应脱敏查询语句(掩码字符使用*,需要换成x直接替换即可):
select case when length(last_name) <= 3 then last_name else rpad('*', length(last_name) - 3, '*') || substr(last_name, -3) end as last_name, case when length(first_name) <= 3 then first_name else rpad('*', length(first_name) - 3, '*') || substr(first_name, -3) end as first_name, case when length(address) <= 3 then address else rpad('*', length(address) - 3, '*') || substr(address, -3) end as address from customer;
如果需要调整脱敏规则,比如保留前N位、保留前后固定位数中间掩码,只需要调整SUBSTR的截取逻辑、掩码生成长度即可,适配性很强。
方法二:12c+版本内置Data Redaction自动脱敏
如果开发环境需要长期使用固定脱敏规则,不想每次写查询都手动加脱敏逻辑,可以直接用Oracle 12c开始自带的DBMS_REDACT内置包配置脱敏策略:配置完成后,仅指定账号(比如开发账号)查询表时会自动返回脱敏后的数据,管理员账号查询仍返回原始数据,业务侧的查询语句不需要做任何修改。
配置示例(仅DEV_USER开发账号查询时生效,所有字段保留最后3位,其余替换为*):
BEGIN DBMS_REDACT.ADD_POLICY( object_schema => 'CUSTOMER表所属的schema名称', object_name => 'CUSTOMER', policy_name => 'CUST_DEV_MASK_POLICY', expression => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') = ''DEV_USER''', column_name => 'LAST_NAME', function_type => DBMS_REDACT.PARTIAL, function_parameters => '*,1,0,0,3' ); END; / -- 按照相同规则给FIRST_NAME、ADDRESS字段追加脱敏配置即可
内容的提问来源于stack exchange,提问作者Ramiz Tariq
相关产品推荐
相关产品推荐

