はじめに
Rails アプリを作っていると、BCrypt という単語をよく目にします。
しかし、BCrypt について書かれた日本語の記事は非常に少なく、$2a$
や $2x$
などいくつか存在するバージョンの違いがよくわかりませんでした。
それらについて、英語の文献を参照したため、日本語でまとめておこうと思います。
Bcrypt の バージョン
BCrypt を表すバージョンは、$2$
$2a$
$2b$
$2x$
$2y$
が存在するようです12。
-
$2$
(Provos・Mazières, 1999)3 による最初の BCrypt 1。 -
$2a$
$2b$
のいくつかの実装に存在するセキュリティ上の問題を修正したバージョン1。 -
$2x$
crypt_blowfish の$2a$
に存在していた問題を修正する前と同一のバージョン2。 -
$2y$
crypt_blowfish の$2a$
に存在していた問題を修正した後と同一のバージョン2。 -
$2b$
公式の BCrypt の最も新しいバージョン1。
crypt_blowfish における $2a$
の問題
crypt_blowfish の $2a$
には問題が存在していたことがあり、修正前後で動作が異なります。そのため、crypt_blowfish で作成された $2a$
の値については、それが修正前後のどちらで作成されたのかわかりません。
何が crypt_blowfish なのかはよくわかりませんでしたが、調べた範囲では PHP の crypt で使われるものが該当するようです。
どのバージョンを使うべきか
通常は $2a$
を使えば問題ないようです[^4]。
ただし、crypt_blowfish の修正前の $2a$
が混在している可能性が存在する場合は、$2y$
を使用するのが望ましいと思われます。
まとめ
- BCrypt にはいくつかのバージョンが存在する
- Rails では
$2a$
を使えば(デフォルトのまま使えば)問題ない。