bcryptハッシュの生成と照合
パスワードのbcryptハッシュを作成したり、保存済みのハッシュとパスワードが一致するかを確かめたりできます。ブラウザーの外には何も出ません。
bcryptハッシュをオンラインで生成・検証
bcryptは、わざと遅くなるように作られたパスワードハッシュのアルゴリズムです。SHA-256のような汎用ハッシュは毎秒数十億回も計算でき、それは流出したデータベースからパスワードを推測しようとする者にとってまさに好都合です。bcryptは推測1回ごとのコストを高くし、そのコスト係数によってハードウェアの高速化に合わせて負荷を増やせます。PHP、Laravel、Ruby on Rails、Spring Securityをはじめ、多くのフレームワークで既定のアルゴリズムです。
このページはハッシュ生成ツールのbcryptタブを開きます。よくある用途は、データベースに直接最初の管理者アカウントを作る、テスト用のフィクスチャを書く、ユーザーがログインできない原因を調べる、といったものです。
bcryptハッシュの読み方
bcryptハッシュは常に60文字で、後で照合するのに必要な情報をすべて含んでいます。$2y$10$N9qo8uLOickgx2ZMRZoMye...を例に見てみましょう。
| 部分 | 意味 |
|---|---|
$2y$ | バージョンのプレフィックス |
10 | コスト。2の10乗、つまり1,024回の鍵セットアップ |
| 続く22文字 | ランダムなソルト |
| 最後の31文字 | ハッシュ本体 |
コストの選び方
ここではコストを4から14の範囲で設定できます。1上げるごとに計算量が2倍になるので、コスト12はコスト10の4倍遅くなります。自分のサーバーで1回のハッシュ化が1秒未満に収まる程度を目安にしてください。ツールは処理中に進捗を表示するので、違いを体感できます。コストはハッシュの中に保存されるため、後から引き上げて、各パスワードを持ち主の次回ログイン時にハッシュし直すこともできます。
72バイトの制限
bcryptはパスワードの先頭72バイトしか読みません。それより長い入力は拒否されるのではなく黙って切り捨てられるため、先頭72バイトが共通する2つの長いパスワードは同じハッシュになります。日本語を含め英語以外の文字は、UTF-8で1文字あたり2〜4バイトを使うことが多いため、上限は文字数から想像するより早く訪れます。ツールは入力中にバイト数を数え、72を超えると警告します。
コードでハッシュを扱う
| 言語 | 作成 | 検証 |
|---|---|---|
| PHP | password_hash($pw, PASSWORD_BCRYPT) | password_verify($pw, $hash) |
| Node.js (bcryptjs) | bcrypt.hash(pw, 10) | bcrypt.compare(pw, hash) |
| Python (bcrypt) | bcrypt.hashpw(pw, bcrypt.gensalt()) | bcrypt.checkpw(pw, hashed) |
ハッシュ化するランダムなパスワードはパスワード生成ツールで作れます。パスワードではなくファイルのチェックサムが目的なら、SHA-256を使ってください。