6

先週、Fedora を最新の 28 リリースにアップグレードしました。これには、mongodb の 3.6 へのアップグレードが含まれています。Fedora 28 へのアップグレード後に mongodb サービスを修復する方法を参照してください。mongodが起動しなくなるという最初の問題をどのように解決したかについて。現在、この同じデータベースを使用する Rails アプリケーションで別の問題に直面しています。

これはおそらくmongodbのアップグレードとは関係ありませんが、そのコンテキストを提供する価値があると思い、十分な提供がない場合の解決策を見逃さないでください.

したがって、システムのアップグレードにより、この Rails プロジェクトにログインしようとすると、initialize'`で発生するBCrypt::Errors::InvalidHash in Devise::SessionsController#create エラーで失敗します。bcrypt (3.1.11) lib/bcrypt/password.rb:60:inプロジェクトのRailsコンソールでさらに分析すると、このメソッドへの呼び出しは失敗するようです:

> BCrypt::Password.create('TestPassword')
BCrypt::Errors::InvalidHash: invalid hash
from /home/psychoslave/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/bcrypt-3.1.11/lib/bcrypt/password.rb:60:in `initialize'

bundleをアンインストール/再インストールしようとしましbcryptたが、代わりに bcrypt gem の github リポジトリ バージョンを使用しましたが、何も変わりませんでした。

initialize'`を見ると/home/psychoslave/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/bcrypt-3.1.11/lib/bcrypt/password.rb:60:in、問題はハッシュが有効ではないようです。

# Initializes a BCrypt::Password instance with the data from a stored hash.
def initialize(raw_hash)
  if valid_hash?(raw_hash)
    self.replace(raw_hash)
    @version, @cost, @salt, @checksum = split_hash(self)
  else
    raise Errors::InvalidHash.new("invalid hash")
  end
end

対応するテストは次のとおりです。

  def valid_hash?(h)
    h =~ /^\$[0-9a-z]{2}\$[0-9]{2}\$[A-Za-z0-9\.\/]{53}$/
  end

ハッシュ自体はBCrypt::Engine.hash_secret(secret, BCrypt::Engine.generate_salt(cost))、プラットフォームで call を使用して作成され、 bcrypt-3.1.11/ext/mri/bcrypt_ext.c__bc_crypt(secret.to_s, salt)を呼び出しているようです。

さらに重要なことbinding.pryに、valid_hash?メソッドに a を追加すると、 への呼び出しに対して返されたハッシュ値を確認できますBCrypt::Password.create('TestPassword')。実際には、開始が通常のように見えるかなり長い文字列ですが、誤って生成された可能性が最も高いシーケンスで終了します。

"$2a$10$Eb1f8DSkGh4G1u5GicyTYujBk6SwFXKYCH.nqxapmBlqJ0eFYdX32\x00\x00\x00\x00\xD1F\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00T\xBD\x02\x00\x00\x00\x00\x00\xF1V\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\xE2\xB0\x02\x00\x00\x00\x
00\x00AW\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00 \x04\x00\x00\x00\x00\x00\x00\x86\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\xB5\xF8\x0E\x00\x00\x00\x00\x00q\xD8\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00…"

興味があれば、ハッシュ全体のダンプを提供できます (約 32Ko!)。

4

2 に答える 2