手机号脱敏成 138****8000 之后,运营按号码 like 搜索一条都搜不到,只能让用户报订单号。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,掩码把中间四位换成星号,库里存的就是带星号的值,like 只能匹配到尾号。脱敏和检索共用了一份数据。
「脱敏字段检索」这类改动最怕改一半,回滚脚本先准备好,再动生产。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
SELECT id FROM users
WHERE phone_hash = sha256(concat('salt', '13800138000'));
权限不要一口气开到最大,先加到够用再往上试,范围小才好收。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
具体做法是,保留一列确定性加密值用于检索;查询时先加密再等值匹配;展示层再脱敏;不支持模糊搜索 只支持完整号码精确查。
最后用这个标准收尾,完整号码能精确定位到用户 返回结果仍是掩码。
