web-dev-qa-db-ja.com

パスワードハッシュを理解しようとする

パスワードハッシュを理解しようとしています。昔は、MD5(パスワード+ salt)だけでとてもシンプルに見えました。その後、md5に衝突があることが証明されたため、人々はSHA1などに移行し始めました。

次に、低速チェックを十分に遅くするために、ハッシュアルゴリズムの多くの反復を実装するために、低速を作成する必要があることについて話し始めました。

私が理解しようとしているのは:

  • SHA512を十分に反復して低速で作成すると、パスワードアルゴリズムでSHA512を使用できないのはなぜですか?例は、パスワードを100k回SHA512することです。
  • 上記の代わりにPBKDF2またはbcryptが推奨されるのはなぜですか?それともなぜそうではないのですか?

    この回答 は、「認証目的で安全に保管するためにパスワードをハッシュするためのものではない」と述べています。ただし この答え (多くの賛成票を含む)は反対(?)を推奨します。パスワードを安全に保管するには、pbkdf2/bcrypt/scryptを使用する必要があります。

  • PBKDF2関数が下にあるSHA1に依存している場合、SHA1が壊れていると証明できるかどうかは本質的に安全ではありませんか? ( RFC2898 .NET実装

うまくいけば、誰かが上記の質問に答えることができれば、単純なハッシュアルゴリズム(提供された速度低下)では不十分である理由と、単純なパスワードストレージを実行するために、この一見複雑なキー派生関数がすべて必要な理由も理解できます。

5
Chris Dale

その後、md5に衝突があることが証明されたため、人々はSHA1などに移行し始めました。

パスワードのハッシュには衝突耐性は必要ありません。それでも、必要なハッシュよりも弱いハッシュを使用する理由はありません。

SHA512を十分に反復して低速で作成すると、パスワードアルゴリズムでSHA512を使用できないのはなぜですか?例は、パスワードを100k回SHA512することです。

出来るよ。最初からパスワードとソルトを混ぜている限り、安全です。

標準的なスキームがたくさんある場合は、独自のスキームを発明する理由がないため、お勧めしません。

上記の代わりにPBKDF2またはbcryptが推奨されるのはなぜですか?それともなぜそうではないのですか?

なぜなら、それらは標準化されており、多くの暗号技術者によって見られてきたからです。したがって、アドホックスキームよりもスキームに弱点がないことを確信できます。

PBKDF2は本質的には反復ハッシュ関数であり、HMACを使用してパスワードとソルトを混合します。

bcryptは別の構造です。 PBKDF2は少しだけメモリを必要とするため(数kB)、必要なゲートの数が少し増えるため、そのPBKDF2を壊すのは少し難しいです。

メモリパラメータを調整できるscryptと呼ばれるスキームもあります。これにより、スキームで大量のメモリ(数メガバイト以上)を消費させることができます。これにより、特別なハードウェアが標準のハードウェアよりもはるかに効率的になることを防ぎます。
scryptはおそらくこれらのスキームの中で最も強力です。しかし、これは比較的新しく、一般的でないプリミティブを使用しているため、多くのユーザーは古いスキームを選択しています。

この回答は、「認証目的で安全に保管するためにパスワードをハッシュするためのものではない」と述べています。ただし、この回答(多くの賛成票を含む)は反対を推奨します

この質問は、パスワードハッシュを使用するPBKDF2に対するNISTの明示的な推奨事項に関するものです。密接に関連する手法であるパスワードベースのキーの導出にはPBKDF2を使用することのみを推奨します。 NIST勧告がないことは、そのスキームが悪いことを意味するものではありません。

PBKDF2関数が下にあるSHA1に依存している場合、SHA1が壊れていると証明できるかどうかは本質的に安全ではありませんか?

SHA1に対する最初のプリイメージ攻撃がある場合、それは特定の制約の下で機能します。そうであれば、SHA1を使用するPBKDF2は壊れています。一方、衝突攻撃は十分ではありません。最初のプレイメージ攻撃は、通常、衝突攻撃よりもはるかに困難です。たとえば、MD5に対するものさえ知りません。

8
CodesInChaos

SHA512を十分に反復して低速で作成すると、パスワードアルゴリズムでSHA512を使用できないのはなぜですか?例は、パスワードを100k回SHA512することです。

これが機能しない理由はありません。これがPBKDF2の本質です。

上記の代わりにPBKDF2またはbcryptが推奨されるのはなぜですか?それともなぜそうではないのですか?

PBKDF2は基本的にSHAハッシュを取得し、それを複数回繰り返します。

一方、bcryptは、blowfishアルゴリズムを使用し、実行するためにより多くのメモリアクセスを必要としますが、これはGPUではあまり効率的ではありません。これにより、GPUを使用する攻撃者がクラッキングプロセスを高速化することが困難になります。これは、拡張により、scryptと同じです。

PBKDF2関数が下にあるSHA1に依存している場合、SHA1が壊れていると証明できるかどうかは本質的に安全ではありませんか?

私の理解から、はい。

ハッシュにキー微分関数を使用することを推奨する理由は、反復回数を増やすだけでパスワードハッシュを解読するために必要な時間を増やすことができるためです。これにより、ハッシュアルゴリズムを変更せずにハードウェアがますます強力になるため、ハッシュを安全に保つことが容易になります。

Bcryptの実装はそれほど複雑ではありません。多くの単純なライブラリがあなたのために働きます。例: phpass for Perl、php and python。

私はまさに暗号の専門家ではないので、私の答えを一粒の塩で見てください。しかし、これは私が読んだ専門家からの一般的な合意のようです。

最初のリンクに関して、彼の回答は質問に対するものであったと思います。パスワードのハッシュにPBKDF2を使用するための公式のNIST要件はありません。それでも、単純なSHAハッシュよりは優れています。

8
user10211
  1. 線形のハードウェアスケーラビリティにより、反復処理によって中断する時間が常に増えるとは限りません。

  2. Bcryptはハードウェアデコーダーを遅くするからです。

  3. しかし、それがPKBFを複数の反復で行うポイントであり、この方法により遅くなりますが、bcryptの方が強力です。

1
Andrew Smith