web-dev-qa-db-ja.com

最も安全なパスワードハッシュアルゴリズム?

現在最も暗号的に安全なハッシュアルゴリズムは何ですか? ( PHPで利用可能

Speedは関係ありません。なぜなら、固定されたtime(固定された反復数ではなく)でハッシュを反復しているためです。私が興味を持っているのは数学的な強さです。

私の直感は、それがwhirlpoolであり、束の中で最大かつ最も遅いことを教えてくれます。それまたはSHA-512。しかし、ネットのどこで、専門家が推奨するものを見ることができますか?

41
Core Xii

暗号学者は、細かい印刷物を読んだときに、安全なハッシュ関数が実際に存在する証拠はまったくないと指摘することができます。私たちが今持っている唯一のものは、弱点がまだ発見されていない候補者です。

したがって、期待できる最高の機能は、長い間多くの暗号技術者による調査に耐えてきた機能です。また、十分に広い出力が必要です(「128ビットのセキュリティ」を実現したい場合は256ビットで十分であり、それを超えることはほとんど意味がありません)。現在、2011年夏の時点では、これはWhirlpoolではなくSHA-256またはSHA-512を指しています。

一般的なマシンでかかる時間に基づいて反復回数を計算するのは良い考えです-しかし、それを時間に基づいて計算するreallyが実行するyourマシンはではない良い考えです。そうしないと、マシンがその時点で多くの要求を処理していたため、一部のパスワードの反復回数が少なくなる可能性があります(ところで、攻撃者が強制的に実行する可能性がある状況)。多くの反復を使用することは、パスワードハッシュを低速にすることによって攻撃者を阻止することを意図しています攻撃者のコンピュータ-それはまた、システムで遅くなることは不幸な副産物です。しかし、真のターゲットは攻撃者が召集できるマシンのパワーです。攻撃者のマシンで実際にベンチマークを行うことはできないため、システムの平均的な負荷が許容できる限り、大まかな見積もり、つまり可能な限り高い固定カウントに頼る必要があります(重要な単語は「平均」であり、あなたが実行するつもりである動的な測定を失格にします)。

また、攻撃者のマシンがあなたのマシンのように見える必要はありません。たとえば、 [〜#〜] gpu [〜#〜] またはa [〜#〜] fpga [〜#〜] の場合があります。一般的なサーバーで取得できる機能。 PC以外のハードウェアを使用することで、攻撃者がパフォーマンスを大幅に向上させることができない機能が必要です。この場合も、これはSHA-256またはSHA-512を促進します。これは、32ビットまたは64ビットの算術演算でのCPU効率を意味し、AESが設計されたものと同様のハードウェア最適化の恩恵を受けることができるワールプールではありません。

最後に、反復は仕事の一部にすぎません。また、十分に長く、独特の十分な塩も必要です。反復とソルティングを同時に行うのは少し難しい場合があります。 PBKDF2 などの標準的な構成を使用することをお勧めします(これは、キー派生関数として意図されたものであり、パスワードハッシャーではありませんでしたが、PBKDF2もそれでかなり優れていることがわかります)。

33
Thomas Pornin

OPのコメントから:

既知の高速な解決策がない数学的な問題に基づいて、「安全」である。このような問題の中で最も複雑なものに基づいた、「最も安全」なもの。ハッシュアルゴリズムは、それを壊すことが暗号学/数学に大きな貢献を必要とする場合、「強力」と見なされます。

読んでいるように聞こえます Thomas Ptacekの「Enough With the Rainbow Tables:What You Need to Know About Secure Password Schemes」 、そして今、パスワードストレージに最適化された最新の暗号化ハッシュはどれなのか疑問に思っています。 「最も安全」と考えられています。

明確な答えはないと思います。私の知る限りでは、プログラミングコミュニティの現在のお気に入り(scryptとbcrypt)のいくつかは、パスワードハッシュ関数として厳密にピアレビューされていません。少なくとも、それらは NISTハッシュ関数の競合エントリ がどのように吟味されるかに匹敵する多数の暗号技術者によって査読されていません。

とはいえ、現在のハッカーニュースのコンセンサスは次のとおりです。

  1. scrypt 。メモリとCPUの両方を集中的に使用するため、 scryptは現在のパスワードハッシュの中で最も高い安全マージンを持っていると考えられています 。あなたはすることができます ここでそのデザインの詳細を参照してください
  2. 上記のトーマス・プタチェクのブログ記事 で述べたように、bcryptは以前のチャンピオンでした。
  3. PBKDF2 およびSHA2の複数のラウンド(fx nix Crypt with SHA256 )は3番目に優れていると考えられています(これらの1つが「最良」であるかは、反復回数に大きく依存します)中古)。

(「ハッカーニュース」はほとんどがプログラミングコミュニティであり、その名前が一部のセキュリティスペシャリストコミュニティを暗示しているわけではないことに注意してください(一部のコミュニティもそこにいるにもかかわらずです)。)

このサイトを見回すと、 cryptographypasswords および hashing タグfxの下に、通常は1つではないことがわかります「最良の」パスワードハッシュについて言及。ピアレビューが比較的限られているため、本当の暗号学者がどれが「最強」であるかについて明確なコンセンサスがないため、それは一部ではないでしょうか。

これはかなり 偶数で簡単に読める比較 です(おそらくscryptがまだ新しすぎるためと思われます)。

ハッシュは、固定された反復回数ではなく固定された時間にわたって反復しているため、速度は関係ありません。

これらのハッシュのいくつかでは、実際にはそれができません。ライブラリを呼び出すときに「仕事係数」を指定すると、ライブラリが残りを処理します。

20
Jesper M

CRYPT_BLOWFISH(blowfish対称暗号に基づくOpenBSD bcryptですが、実際のハッシュアルゴリズムです。これについては多くの混乱があるようです)とCRYPT_SHA512が最適です。これらはどちらも、使用する「ラウンド」の数をスケーリングするオプションを提供し、セキュリティ/パフォーマンスのトレードオフを選択できるようにします。

たとえば、フグのデフォルトのラウンド数は7です(値の範囲は4〜31)。この値は対数であるため、増加するたびにアルゴリズムが10倍以上実行されます。 13の値は、Core2Duo 2.4ghzでハッシュごとにほぼ1分かかります

これを許容できるパフォーマンスと同じくらい高く調整すると、最も強力なセキュリティが得られます。

注:最近、bcryptの一部の実装にバグが見つかったため、代わりにSHA-512を使用することをお勧めします。

注:SHA-512は、64ビットプロセッサのSHA-256よりも高速に計算されます(特に、SSE2_64で最適化されている場合。特に、これを考慮し、追加のラウンドを使用して、ハッシュが目的に十分に強いことを確認する必要があります。

オープンソースアプリケーション hashkill は、最新のGPUが最新のハッシュアルゴリズムをどれだけ迅速にクラックできるかについて、いくつかのパフォーマンスベンチマークを公開しました。具体的には、Radeon HD 6990は次のことができます。11001メガハッシュ/秒のストレートMD5(CRYPT_MD5はソルト処理され、FreeBSD実装は100ラウンドを使用します)。 3444メガハッシュ/秒のストレートSHA1。

7
Allan Jude

phpass を使用することをお勧めします

これは、PHPアプリケーションで使用するためのポータブルなパブリックドメインパスワードハッシュフレームワークです。PHP 3以上で動作するように意図されており、実際にテストされています少なくともPHP 3.0.18から5.3.0まで)。

Phpassでサポートされる推奨(最も安全な)ハッシュ方法は、OpenBSDスタイルのBlowfishベースのbcryptであり、これも当社のパブリックドメインcrypt_blowfishパッケージ(Cアプリケーション用)でサポートされ、PHP CRYPT_BLOWFISHとして知られています) PHP CRYPT_EXT_DESとして知られている)BSDIスタイルの拡張DESベースのハッシュへのフォールバック、およびphpass自体に実装されたMD5ベースのソルトおよび可変反復カウントパスワードハッシュへの最後の代替フォールバック(ポータブルハッシュとも呼ばれます)。

Webサイトによると、Blowfishベースのbcryptは最も安全なハッシュです。これは " ムーアの法則の証明 "であり、他のほとんどの場合はそうではないため、私はこれが正しいと信じています。

0
Alfred