You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级Fedora 28与MongoDB 3.6后,BCrypt不再接受哈希值的原因

排查Rails应用中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:52:03