フリー百科事典『ウィキペディア(Wikipedia)』bcryptファイル暗号化ユーティリティについては「Blowfish」をご覧ください。この項目は内容が専門的であり、一般の閲覧者にはわかりにくくなっている恐れがあります。専門用語をわかりやすい表現にするための修正をして下さる協力者を求めています。Mazièresによって設計された1999年にUSENIXにて公開された、Blowfish暗号を基盤としたパスワードハッシュ化関数である[1]。レインボーテーブル攻撃に対抗するためにソルトを組み込んでいる以外に、bcryptは適応的な特性を備えている。計算能力が増えたとしてもブルートフォース攻撃に耐えられるように、繰り返し回数を増やして速度を落とせるようになっている。Linux[3]などのLinuxディストリビューションを含む他のシステムでも利用されている。背景[編集]Blowfishはブロック暗号の中では鍵のセットアップフェーズのコストが高いことで知られている。Blowfishは標準状態はいくつかのサブキーで開始される。その後、鍵の一部を使ってブロック暗号化を行い、この暗号化(正確にはハッシュ)の結果を使ってサブキーのいくつかを置換する。その後は変更された状態を使って鍵の残りの部分の暗号化を行い、その結果を使ってより多くのサブキーを置換する。この方法を繰り返し、段階的に状態を変更しつつ鍵のハッシュ化とビットの状態の置き換えを行い、最終的にすべてのサブキーを設定していく。ProvosとMazièresはこの方法を取り入れ、さらに発展させた。Blowfish")という名前をつけた。このアルゴリズムでは標準のBlowfishの鍵セットアップから変更され、すべてのサブキーの設定において、ソルトとパスワードの両方を利用する。その後は、ソルトとパスワードを交互に鍵として使い、標準のBlowfishの鍵作成アルゴリズムを複数ラウンド数適用していく。ラウンドのたびに、以前の適用結果をサブキーの状態として計算を行う。理論的にはBlowfishの鍵スケジュールほど強くはないが、鍵作成のラウンド数が変更可能であるため、任意でこのプロセスの計算量を増やして遅くすることが可能であり、ハッシュやソルトに対するブルートフォース攻撃に対抗できる。"$2y$")という接頭辞を持つ。shadowパスワードは暗号フォーマットをモジュール化[10]しているが、この接頭辞を見ることでハッシュ文字列がbcryptハッシュであることがわかる。(Radix-64エンコードされて31文字になっている)が含まれる[11]。Radix-64はunix/cryptアルファベットを利用するもので、標準のBase-64[12][13]とは異なる。コストパラメータはキー拡張の反復回数を設定するもので、2のべき乗の数となっていて、暗号アルゴリズムの入力値となっている。いうshodowパスワードのレコードを例にとると、コストパラメータは10で、キー拡張のラウンド数は210になる。IjZAgcfl7p92ldGxad68LJZdL17lhWyとなっている。一般的なパスワード管理のプラクティス通り、ユーザーのパスワードそのものが格納されることはない。$2$であると定義されていた。('sha512crypt')$2a$オリジナルの仕様ではASCII以外の文字やnull終端をどのように扱うべきかの定義がなかった。このバージョンの仕様では文字列のハッシュ化について定義され改訂された:文字列はUTF-8エンコードされるnull終端がふくまれなければならないこれらの変更により、バージョンが$2a$[15]に変更された。(2011年6月)2011年6月に、BCryptのPHP実装であるcrypt_blowfishの中でバグが発見された。8ビット文字列の扱いを間違っていた[16]のが原因であった。システムの管理者は既存のパスワードデータベースを開き、$2a$を$2x$に更新することで、既存の間違ったハッシュアルゴリズムを明示的に使い続けていることを示すことを提案した。出力するアイディアを提案した。標準的なOpenBSDを含むどのディストリビューションも2x/2yのアイディアを採用しなかった。このバージョンマーカーの変更はcrypt_blowfish.に限定された。(2014年2月)バグがOpenBSDのbcrypt実装で発見された。charに長さを格納をしていたのが原因である[15]。パスワード長として255文字を越えると、オーバーフローして長さが255にまるめられてしまった[17]。BCryptはOpenBSDのために作られた。OpenBSDのライブラリでバグが発見された時はバージョン番号が更新されることが決定される。いうアルゴリズムをBlowfishを用いて64回暗号化した文字列を作成する。log2(Iterations)。log2(Iterations)。stateInitialStateはオリジナルのBlowfishアルゴリズムと同じように動作する。16進数の少数点数部分を設定したものである。scheduleと同じため、すべてゼロのソルト値とのXORをとるのは意味がない。salt)も同様だが、ソルトを128ビットの鍵として扱っている。ユーザー入力[編集]多くのbcrypt実装はパスワードを最初の72バイトだけ切り出して利用する実装になっている。算術アルゴリズムが18個の32ビットサブキー(72オクテット/バイトと同じ)に初期化することを要求しているからである。ユーザーランドのテキストベースのパスワードをこのアルゴルズムの数値とどのようにマッピングするべきかを強制するものはなかった。「最後に、key引数は秘密暗号鍵であり、ユーザーが選んだ56バイトまでのパスワードである可能性がある(文字列がASCII文字列の場合はゼロのバイトの終端も含む)」アルゴリズムは初期値として72バイトの入力を扱うが、上記に引用文が「56バイトまで」のパスワードに言及している点は注目に値する。「鍵サイズの448ビット制限によりすべてのサブキーのすべてのビットは、鍵のすべてのビットに依存していることが保証される」パスワードを初期の数値の値に変換する方法は実装によって異なる可能性があるため、非ASCII文字を含んだパスワードの強度が低下する可能性がある[19]。2016年3月4日時点のオリジナルよりアーカイブ。2015年8月20日閲覧。2017年3月11日閲覧。2018年7月19日閲覧。