29

質問は同じタイトルです。$2x$ は BCrypt で使用されていますか?

次のシナリオは正しいですか?

サーバーの$2a$PHP バージョンが以前の5.3.7. PHP を にアップグレードしたので5.3.7+、まず以前のパスワードを$2x$アルゴリズムで検証してから、パスワードを$2y$プレフィックスで再ハッシュする必要があります。それは正しい?

4

1 に答える 1

95

BCrypt の亜種

$2$

BCrypt は OpenBSD の人々によって設計されました。これは、OpenBSD パスワード ファイルに格納するためにパスワードをハッシュするように設計されています。ハッシュ化されたパスワードは、使用されるアルゴリズムを識別するためのプレフィックスと共に保存されます。BCrypt はプレフィックス を取得しました$2$

これは、他のアルゴリズムのプレフィックスとは対照的です。

  • $1$: MD5
  • $3$: NTHASH
  • $5$: SHA-256
  • $6$: SHA-512
  • $7$: スクリプト

$2a$

元の BCrypt 仕様では、非 ASCII 文字の処理方法やヌル ターミネータの処理方法が定義されていませんでした。仕様が改訂され、文字列をハッシュするときに次のことが指定されました。

  • 文字列は UTF-8 でエンコードされている必要があります
  • null ターミネータを含める必要があります

$2x$、$2y$ (2011 年 6 月)

crypt_blowfishにバグが発見されました、BCrypt の PHP 実装です。8 番目のビットが設定された文字の処理ミスでした。

彼らは、システム管理者が既存のパスワード データベースを更新し、 に置き換え$2a$$2x$、それらのハッシュが不適切であることを示すことを提案しました (そして、古い壊れたアルゴリズムを使用する必要があります)。$2y$彼らはまた、固定アルゴリズムによって生成されたハッシュに対して crypt_blowfish を発行させるというアイデアも提案しました。正規の OpenBSD を含め、他の誰も2x/の考え方を採用しませんでし2yた。このバージョン マーカーは crypt_blowfish に限定されていました.

バージョン$2x$および$2y$は、 $2a$よりも「優れている」または「強い」わけではありません。これらは、BCrypt の特定のバグのある実装の名残りです。

20億ドル (2014 年 2 月)

BCrypt の OpenBSD 実装でバグが発見されました。彼らは文字列の長さをunsigned char. パスワードが 255 文字を超えると、オーバーフローして 255 文字で折り返されます。

BCrypt は OpenBSD 用に作成されました。ライブラリにバグがある場合、彼らはバージョンを上げてもよいと判断しましたこれは、 「彼らの」仕様に最新の状態を保ちたい場合は、他のすべての人がそれに倣う必要があることを意味します。

バージョン$2b$は、 $2a$よりも「優れている」または「強い」わけではありません。これは、BCrypt の 1 つの特定のバグのある実装の名残です。しかし、BCrypt は標準的に OpenBSD に属しているため、バージョン マーカーを好きなように変更できます。

2a2x2y、および2bの間に違いはありません。実装を正しく記述した場合、それらはすべて同じ結果を出力します。

そして、最初から正しいことを行っていた場合 (文字列を utf8 に格納し、ヌル ターミネータをハッシュすることも)、 22a2x2y、および2bの間に違いはありません。実装を正しく記述した場合、それらはすべて同じ結果を出力します。

2x と 2y を気にする必要があるのは、あなたがcrypt_blowfishを使っている人だけです。2bを気にする必要があるのは、OpenBSD を実行していた可能性がある人だけです。

他のすべての正しい実装は同一で正しいものです。

于 2016-03-25T17:54:27.710 に答える