351

ハッシュ化されたパスワード (BCrypt を使用) をデータベースに保存したいと考えています。これに適したタイプはどれで、正しい長さはどれですか? BCrypt でハッシュ化されたパスワードは常に同じ長さですか?

編集

ハッシュの例:

$2a$10$KssILxWNR6k62B7yiX0GAe2Q7wwHlrzhF3LqtVvpyvHZf0MwvNfVu

いくつかのパスワードをハッシュした後、BCrypt は常に 60 文字のハッシュを生成するようです。

編集2

実装について言及せずに申し訳ありません。jBCryptを使用しています。

4

4 に答える 4

400

bcrypt のモジュラー crypt 形式は、

  • $2$$2a$またはハッシュアルゴリズムとフォーマット$2y$の識別
  • コスト パラメータを示す 2 桁の値と、それに続く$
  • 53 文字の長さの base-64 でエンコードされた値 (これらは、標準の Base 64 エンコードアルファベットとは異なるアルファベット、、、–<code>9、–<code>Z、–<code>z を使用し.ます)/で構成されます。 0Aa
    • 22 文字のソルト (実際には、デコードされた 132 ビットのうち 128 ビットのみ)
    • 暗号化された出力の 31 文字 (事実上、デコードされた 186 ビットのうち 184 ビットのみ)

したがって、全長はそれぞれ 59 バイトまたは 60 バイトです。

2a 形式を使用すると、60 バイトが必要になります。そのため、MySQL ではCHAR(60) BINARYorBINARY(60)を使用することをお勧めします(違いについては_binバイナリ照合を参照してください)。

CHARバイナリセーフではなく、等価性はバイト値だけに依存するのではなく、実際の照合に依存します。最悪の場合Aは と等しいものとして扱われaます。詳細について_bin、およびbinary照合順序を参照してください。

于 2011-05-04T11:11:14.097 に答える
58

Bcrypt ハッシュは列に格納できBINARY(40)ます。

BINARY(60)、他の回答が示唆するように、最も簡単で最も自然な選択ですが、ストレージ効率を最大化したい場合は、ハッシュを無損失で分解することで 20 バイトを節約できます。これについては、GitHub で詳しく説明しています: https://github.com/ademarre/binary-mcf

Bcrypt ハッシュは、モジュラー クリプト フォーマット (MCF) と呼ばれる構造に従います。バイナリMCF (BMCF) は、これらのテキスト ハッシュ表現をよりコンパクトなバイナリ構造にデコードします。Bcrypt の場合、結果のバイナリ ハッシュは 40 バイトです。

Gumbo は、Bcrypt MCF ハッシュの 4 つのコンポーネントをうまく説明してくれました。

$<id>$<cost>$<salt><digest>

BMCF へのデコードは次のようになります。

  1. $<id>$3ビットで表現できます。
  2. <cost>$、04-31 は 5 ビットで表すことができます。これらを合わせて 1 バイトにします。
  3. 22 文字のソルトは、128 ビットの (非標準) base-64 表現です。Base-64 デコードでは 16 バイトになります。
  4. 31 文字のハッシュ ダイジェストは、base-64 で 23 バイトにデコードできます。
  5. すべてを 40 バイトにまとめます。1 + 16 + 23

上記のリンクで詳細を読むか、GitHub で私の PHP 実装を調べることができます。

于 2013-05-17T09:09:48.923 に答える
27

アルゴリズムでPHPを使用してbcryptハッシュを生成している場合password_hash()PASSWORD_DEFAULTこの質問を読んでいる人の大部分がそうであると思います)、将来的にpassword_hash()は別のアルゴリズムをデフォルトとして使用する可能性があることに注意してください。ハッシュの長さに影響します (ただし、必ずしも長くなるとは限りません)。

マニュアルページから:

この定数は、より強力な新しいアルゴリズムが PHP に追加されるにつれて、時間の経過とともに変化するように設計されていることに注意してください。そのため、この識別子を使用した結果の長さは、時間の経過とともに変化する可能性があります。したがって、 60 文字を超えて拡張できるデータベース列に結果を格納することをお勧めします(255 文字が適切です)。

bcrypt を使用すると、255 バイトのパスワード ハッシュを保存するために 10 億人のユーザー (つまり、現在 facebook と競合している) がいる場合でも、データは 255 GB しかなく、これは小さな SSD ハード ドライブのサイズとほぼ同じです。パスワード ハッシュの保存がアプリケーションのボトルネックになることはほとんどありません。ただし、何らかの理由でストレージ容量が実際問題になる可能性が低い場合は、デフォルトでなくてもPASSWORD_BCRYPT強制的に bcrypt を使用することができます。password_hash()新しい PHP バージョンがリリースされるたびに、bcrypt で見つかった脆弱性について常に最新情報を入手し、リリース ノートを確認してください。デフォルトのアルゴリズムが変更された場合は、その理由を確認し、新しいアルゴリズムを使用するかどうかを十分な情報に基づいて決定することをお勧めします。

于 2015-07-20T21:30:38.930 に答える
22

たとえばMD5ハッシュでできるように、これを保存するためにできる巧妙なトリックはないと思います。

CHAR(60)常に60文字の長さなので、として保存するのが最善の策だと思います

于 2011-05-04T09:38:23.443 に答える