把生产库脱敏后导到测试环境,发现手机号不用改代码就能直接解密,测试配置里的 cipher.key 和生产是同一个值,两个环境的密文可以互相解。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,密钥按项目只生成了一份,所有环境复制同一个配置。测试环境权限松,拿到密钥等于拿到生产数据。环境隔离只做了网络和数据库,没做到密钥。
「多环境共用密钥」这类改动最怕改一半,回滚脚本先准备好,再动生产。报错里带路径的,先去看那个路径在不在、权限对不对。
grep -n 'cipher.key' config/application-test.yml config/application-prod.yml openssl enc -d -aes-256-cbc -K $TEST_KEY -in prod_phone.enc
具体做法是,每个环境生成独立密钥 生产密钥只在生产密钥管理里存在;测试数据脱敏时用测试密钥重新加密 不要直接搬密文;配置里禁止出现生产密钥的默认值 启动时校验环境与密钥标识;把测试环境密钥换掉 确认解不开生产密文。
最后用这个标准收尾,测试密钥解生产密文报 bad decrypt 两个环境的密文不再互通。
