报错是这么冒出来的。做可逆脱敏时把原文与令牌的映射写进 Redis,方便下游还原,审计时发现任何能连 Redis 的服务都能直接取到明文手机号,脱敏形同虚设。
中间走过弯路,把「映射表没有访问审计,读取无记录」当成主因,改完现象没变。
这类报错背后常见的原因有几处,逐个排除就行。映射表与业务缓存共用实例且没有鉴权。另一种情况是令牌是可预测的序号,拿到映射等于拿到全量数据。
不容易想到的是,备份文件落在共享存储上。
第一件事是确认 Redis 是否开了访问控制
redis-cli config get requirepass
再往下把映射表迁到独立实例并启用 ACL
redis-cli acl setuser mask on '>强密码' '~mask:*' +get +set
令牌改成带密钥的 HMAC 而不是自增序号
python -c "import hmac,hashlib;print(hmac.new(b'k',b'13800000000',hashlib.sha256).hexdigest()[:16])"
给读取路径加审计日志与限速
python mask_store.py --audit --rate 10/s
恢复的判定其实很直接。映射表实例独立且需要 ACL 认证,令牌不可枚举,读取操作都有审计记录,业务侧还原走申请流程。
可逆脱敏的安全性全在映射表上,映射表与业务数据同权限就等于没脱,隔离、加密、审计三件事缺一不可。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
