升级Fedora 28与MongoDB 3.6后,BCrypt不再接受哈希值的原因
上周我把Fedora升级到了最新的28版本,自带的MongoDB也同步升级到了3.6——之前已经搞定了mongod无法启动的问题,但现在用同一数据库的Rails应用又出状况了:BCrypt突然不接受已存储的哈希值。虽然大概率和MongoDB升级没关系,但还是先把背景列出来,方便排查定位。
针对这个问题,可以从这几个方向入手排查:
确认BCrypt与Rails版本的兼容性:系统升级后,可能间接影响了gem依赖的隐性匹配。先检查你的Rails版本对应的BCrypt推荐版本,比如Rails 5.x一般适配BCrypt 3.1.11及以上,然后重新安装适配的版本:
gem uninstall bcrypt gem install bcrypt -v 3.1.17 # 替换成适配你Rails的版本号手动验证哈希值的有效性:从数据库里取出一条用户哈希值,在Rails控制台里直接测试BCrypt的验证逻辑,排除哈希值本身损坏的可能:
# 启动rails console后执行 require 'bcrypt' # 把下面的内容替换成你的实际哈希值和测试密码 BCrypt::Password.new("$2a$12$xxxxxx...") == "test_password"如果这一步抛出错误,说明哈希值格式可能有问题——虽然MongoDB升级大概率不会改存储内容,但可以确认下是否有字符编码或存储类型的隐性变更(比如把字符串存成了其他类型)。
重新编译BCrypt的原生扩展:Fedora升级可能更新了openssl、gcc这类底层依赖库,导致BCrypt的原生扩展适配出问题。可以尝试重新编译:
gem pristine bcrypt如果编译失败,先安装必要的编译依赖:
sudo dnf install gcc make ruby-devel openssl-devel再重新安装BCrypt。
检查Ruby环境一致性:系统升级后,可能不小心切换了Ruby版本(比如从rbenv管理的版本切到了系统Ruby),导致BCrypt的加载路径不对。可以通过以下命令确认当前环境:
which ruby gem list bcrypt确保应用使用的Ruby环境里已经正确安装了BCrypt。
内容的提问来源于stack exchange,提问作者psychoslave

