PHPのhash_password関数がthreefishではなくblowfishを使用する理由を知りたいと思っていました。 Bruce Schneiderによると、フグは時代遅れであり、2匹または3匹の魚を推奨しています。 blowfishは十分に安全ですか、threefishはログイン認証を遅くするだけですか?
PHPはpassword_hash()
に bcrypt を使用しますが、PHPはPHPであるため、混乱を最大にする必要があるため、「Blowfish」と呼びます。
非常に有毒な魚 の家族であることに加えて、Blowfishは20年以上前から ブロック暗号 です。 Bcryptは、Blowfishに似た内部ブロック暗号からたまたま派生したパスワードハッシュ関数ですが、ブロック暗号の使用目的とはまったく異なるもの、つまり暗号化に使用されます。
Threefish は別のブロック暗号であり、さらに別の目的のために設計されました Skein ハッシュ関数の設計です。さて、注意を払ってください、ここでトリッキーなポイントが来ます。 「ハッシュ関数」と「パスワードハッシュ関数」は完全に異なるものです。名前の類似性にもかかわらず、これらは非常に異なる野獣であり、異なる種類の入力を取り、異なる種類の出力を生成し、非常に異なるセキュリティ要件とプロパティを持っています。
Threefishは、さまざまな理由でブロック暗号として設計されました。その主な原因は、衝突を防ぐハッシュ関数を作成するために大きなブロックが必要になるため、大きなブロック(512ビット以上)が必要になることです。ただし、衝突はパスワードハッシュとは完全に無関係であり、Blowfishの短いブロックサイズ(64ビット)はbcryptの問題ではありません。
ブロック暗号として、Threefishは多くの点でBlowfishより「優れています」(大きなブロック、高速、テーブルなしで実装できる...)。ハッシュ関数の構成要素として、ThreefishはBlowfishよりも優れていますが、いくつかの点で異なります。パスワードハッシュ関数の構成要素として、Threefishは実際にはBlowfishよりも劣っています。これは、ハッシュ関数に関してThreefishがBlowfishよりも優れているという同じ理由でです。特に、Threefishはテーブルなしで実装できます。これは、Threefishが [〜#〜] gpu [〜#〜] で完全に最適化された並列実装を可能にすることを意味します。
PHPが「Threefishに切り替えられなかった」理由を説明するものはありません。これは、そのような切り替えが悪い考えである理由を示しているだけです。
PHPの password_hash は bcryptハッシュ関数 を使用します。これは、おそらく scrypt が後継者として並ぶ、最新のパスワードストレージに近いものです。
Schneierの(スペルは修正されていません)コメントへのリンクは提供していませんが、彼がフグの暗号化アルゴリズムについて話しているのではないかと思います。 bcryptはふぐに基づいていますが、同様の弱点があるとは考えられていません。
現在、_password_hash
_は、限られた範囲のハッシュアルゴリズムをサポートするcrypt()
と互換性があるように設計されています。サポートされているアルゴリズムのうち、Blowfishが唯一の暗号化アルゴリズムです。
他の関数はPHPに簡単に含めることができますが、cryptを使用して検証できないハッシュが発生します。