尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

15-数据脱敏mask规则

15-数据脱敏mask规则 15-数据脱敏mask规则的实现查询结果里的身份证号显示成3201**1234、手机号显示成138****5678——这是EA03的masked标记加maskRule规则驱动的。这篇拆14行的mask()方法默认脱敏、keepHead/keepTail规则、以及它和加密的协作顺序。文章目录15-数据脱敏mask规则的实现一、14行核心方法二、三种行为2.1 默认脱敏无规则2.2 keepHead,keepTail双段规则2.3 只保头keepTail02.4 短值保护三、触发链路postProcess的第②步四、脱敏的边界只管显示不管条件五、maskRule怎么配到元数据六、和加密字段的组合矩阵源码browise-metadata/src/main/java/com/browise/ea/core/engine/EaEngine.javaL463-477一、14行核心方法privateStringmask(Stringvalue,Stringrule){// 无规则 → 默认脱敏保留首尾各1字符if(rulenull||rule.isEmpty()){if(value.length()2)returnvalue;returnvalue.charAt(0)***value.charAt(value.length()-1);}// keepHead,keepTail格式如 3,4String[]partsrule.split(,);intkeepHeadInteger.parseInt(parts[0]);intkeepTailparts.length1?Integer.parseInt(parts[1]):0;// 总长不超过保留数 → 不脱敏脱了就全没了if(value.length()keepHeadkeepTail)returnvalue;StringBuildersbnewStringBuilder();sb.append(value.substring(0,keepHead));// 保留头for(inti0;ivalue.length()-keepHead-keepTail;i)sb.append(*);// 中间全星号if(keepTail0)sb.append(value.substring(value.length()-keepTail));// 保留尾returnsb.toString();}二、三种行为2.1 默认脱敏无规则320103199001011234 → 3***4字段只标了masked1、没配maskRule——保守处理只露首尾。适合不知道该露多少的探索期字段。2.2 keepHead,keepTail双段规则maskRule6,4身份证 320103199001011234 → 320103****1234 保留前6位地区码 后4位中间8位打星 maskRule3,4手机号 13812345678 → 138****5678 maskRule2,2姓名 张三丰 → 张**中间1位打星规则的数字含义对应业务字段的标准脱敏规范——身份证露地区校验位、手机露运营商前缀尾号、姓名露姓氏。这些不是技术选择是等保/个人信息保护规范的落地。2.3 只保头keepTail0maskRule4 6222020200112345678 → 6222***************5678不对——parts.length1才解析keepTail单独4时keepTail06222020200112345678 → 6222**************只露前4尾部全星银行卡号场景露卡号前缀识别发卡行就够了。2.4 短值保护if(value.length()keepHeadkeepTail)returnvalue;值比保留的还短——不脱敏直接返回。规则6,4遇上一个8字符的值6410 8——脱敏后全是星号一点信息不剩而且长度信息也暴露了知道这值很短。短值直接透传宁可不脱敏不可脱成全星。三、触发链路postProcess的第②步查询执行 → resultSetToList逐行 → postProcess(row, fields) ① f.isEncrypted() → decrypt先解密 ② f.isMasked() → mask再脱敏第14篇强调过①②顺序不可反脱敏发生在引擎出口——意味着库里存的是明文或密文看字段是否同时标了encrypted查询结果JSON里是脱敏后的值没有任何API能绕过——只要走EA引擎查询脱敏必发生绕过手段当然存在DBA直连数据库但应用层这条路上没有漏洞——这就是在引擎层做、不在Controller层做的价值。四、脱敏的边界只管显示不管条件mask是对查询输出的脱敏。它不影响查询条件——用户输入身份证号320103199001011234做精确查询 → EA05条件 u.ID_CARD ? → 参数原样绑定不脱敏 → 命中数据后输出时脱敏条件不脱敏是正确设计——用户输入的就是真实身份证号拿它查库当然要用真值查到后展示给别人看才需要脱敏。“输入真值、输出脱敏”——脱敏保护的是看结果的人比如柜员不该看到完整身份证号不是发起查询的人。五、maskRule怎么配到元数据EA03加两列语义字段值含义masked1查询输出时脱敏maskRule“6,4”保头6保尾4管理界面EaAdminController的EA03编辑直接填。describe()把这两个字段透传给前端第13篇——前端列表组件拿到maskedtruemaskRule后对非EA路径的数据源也能做同样的脱敏显示。规则只有一份定义元数据两处消费后端postProcess、前端组件——不会出现后端脱了前端又脱一遍的双星号。六、和加密字段的组合矩阵encryptedmasked库里查询输出场景00明文明文普通业务字段01明文脱敏内部可见、对外脱敏手机号10密文明文只防库泄露应用层要看全银行卡号给支付模块11密文脱敏最严格——身份证号防库泄露界面脱敏第三行值得注意加密了但不脱敏——库里是密文DBA拖库也拿不到查询解密后输出明文业务功能需要完整值比如给银行接口传卡号。加密防存储泄露脱敏防显示泄露——两个开关独立控制四种组合。✅ 亮点14行mask()的三种行为默认/双段/只保头、短值保护为什么不脱成全星、脱敏在引擎出口不可绕过的架构价值、输入真值输出脱敏的边界、加密×脱敏四格矩阵。适合做个人信息保护落地的人。扩展方向第30篇CryptoHelper的注解驱动脱敏BaseEntity路径、第34篇安全评审。
返回列表