Bcrypt
ExpandKey関数は次のような処理を行う:
ExpandKey(state, 0, key) は通常のBlowfishのkey scheduleと同じため、すべてゼロのソルト値とのXORをとるのは意味がない。ExpandKey(state, 0, salt)も同様だが、ソルトを128ビットの鍵として扱っている。
bcryptによってハッシュ化された文字列は"$2a$"や"$2b$" (あるいは "$2y$")という接頭辞を持つ。この接頭辞はハッシュ化する際に用いたアルゴリズムによって異なり、前述の接頭辞の場合はshadowパスワードファイルがModular Crypt Formatと呼ばれる形式で記述されており、bcryptハッシュであることを示す。ハッシュ文字列の残りの部分にはコストパラメータ、128ビットのソルト(Radix-64エンコードされて22文字になっている)、184ビットの結果のハッシュ値 (Radix-64エンコードされて31文字になっている)が含まれる. 。Radix-64はunix/cryptアルファベットを利用するもので、標準のBase-64とは異なる。コストパラメータはキー拡張の反復回数を設定するもので、2のべき乗の数となっていて、暗号アルゴリズムの入力値となっている。
$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy というshodowパスワードのレコードを例にとると、コストパラメータは10で、キー拡張のラウンド数は2になる。ソルトはN9qo8uLOickgx2ZMRZoMyeであり、結果のハッシュは IjZAgcfl7p92ldGxad68LJZdL17lhWyとなっている。一般的なパスワード管理のプラクティス通り、ユーザーのパスワードそのものが格納されることはない。
$2$ (1999年)
オリジナルの仕様では接頭辞が $2$であると定義されていた。これはOpenBSDのpasswordファイルにパスワードを格納するために使われるModular Crypt Formatフォーマットにしたがっている:
$1$: MD5ベースの暗号('md5crypt')
$2$: Blowfishベースの暗号 ('bcrypt')
$sha1$: SHA-1ベースの暗号 ('sha1crypt')
$5$: SHA-256ベースの暗号 ('sha256crypt')
$6$: SHA-512ベースの暗号 ('sha512crypt')
$2a$
オリジナルの仕様ではASCII以外の文字やnull終端をどのように扱うべきかの定義がなかった。このバージョンの仕様では文字列のハッシュ化について定義され改訂された:
文字列はUTF-8エンコードされる
null終端がふくまれなければならない
これらの変更により、バージョンが$2a$に変更された。
$2x$, $2y$ (2011年6月)
2011年6月に、BCryptのPHP実装であるcrypt_blowfishの中でバグが発見された。