user 表 id_card 列是明文 varchar(18),数据库备份被拷走,十八万条证件号直接可读,连解密都不用。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,加密只做在应用层的一个工具类里,历史数据没有回填,新写入也走普通 insert。列上没有加密标记,谁也说不清哪些是密文。

「数据库字段加密存储」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。报错里带路径的,先去看那个路径在不在、权限对不对。

ALTER TABLE users ADD COLUMN id_card_enc VARBINARY(256);
SELECT count(*) FROM users WHERE id_card_enc IS NULL;

同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

具体做法是,先加一列存密文 双写一段时间;用 KMS 管理密钥 不要写进配置文件;分批回填历史数据;确认全量后再删明文字段。

最后用这个标准收尾,备份里 id_card 只剩密文 业务读取解密后正常。

作者 9823189