web-dev-qa-db-ja.com

塩漬けのSHA-512ハッシュをブルートフォースする期間(提供される塩)

Javaのアルゴリズムは次のとおりです。

public String getHash(String password, String salt) throws Exception {
    String input = password + salt;
    MessageDigest md = MessageDigest.getInstance(SHA-512);
    byte[] out = md.digest(input.getBytes());
    return HexEncoder.toHex(out);
}

塩が知られていると仮定します。パスワードが辞書の単語である場合と辞書の単語でない場合のブルートフォースの時間を知りたい。

54
timothyjc

あなたの場合、ハッシュアルゴリズムを破ることは、ハッシュアルゴリズムで衝突を見つけることと同等です。つまり、パスワード自体を見つける必要はなく( preimage attack )、ハッシュ関数の出力を見つけるだけですこれは、有効なパスワードのハッシュと同じです(つまり、「衝突」)。 birthday attack を使用して衝突を見つけるにはO(2 ^(n/2))時間かかります。nはハッシュ関数の出力長(ビット単位)です。 。

SHA-2の出力サイズは512ビットであるため、衝突の検出にはO(2 ^ 256)時間かかります。アルゴリズム自体に巧妙な攻撃がないことを考えると(現在、SHA-2ハッシュファミリについては誰も知られていない)、これがアルゴリズムを破るのに必要なことです。

2 ^ 256の実際の意味を理解するために、現在、(全体!!!)宇宙の原子の数は約10 ^ 80、つまり約2 ^ 266であると考えられています。 32バイトの入力(20バイトのソルト+ 12バイトのパスワードに相当)が私のマシンでは、65536(= 2 ^ 16)の計算に〜0,22s(〜2 ^ -2s)かかります。そのため、2 ^ 256 * 2 ^ 16の計算で2 ^ 256の計算が行われます。

2^240 * 2^-2 = 2^238 ~ 10^72s ~ 3,17 * 10^64 years

これを何百万年と呼んでも馬鹿げている。また、地球上で最速のハードウェアを使用して何千ものハッシュを並行して計算しても、それほど良くなることはありません。人間の技術は、この数字を受け入れ可能なものに押し上げることはできません。

したがって、SHA-256を強引に強制することは忘れてください。次の質問は辞書の単語についてでした。このような脆弱なパスワード を取得するために、従来はレインボーテーブル が使用されていました。レインボーテーブルは通常、事前に計算されたハッシュ値のテーブルです。考えられるのは、入力とともにすべての可能なハッシュを事前に計算して保存できれば、O(1)このような膨大な量のデータを保存できるストレージデバイスがないため、もちろんこれは実際には不可能です。このジレンマは として知られていますメモリ時間のトレードオフ 。保存できる値は非常に多く、典型的なRainbowテーブルには、中間リダクション関数(これについてはWikipediaの記事で詳細に説明されています)を含むハッシュチェーンの形式が含まれます時間の節約を少しあきらめて、スペースを節約します。

塩は、そのようなレインボーテーブルを実行不可能にするための対策でした。攻撃者が特定のソルトのテーブルを事前計算することを防ぐために、ユーザーごとのソルト値を適用することをお勧めします。ただし、ユーザーは安全で完全にランダムなパスワードを使用しないため、ソルトが既知であり、単純な試行錯誤方式で一般的なパスワードの大規模な辞書を反復処理するだけで、どれだけ成功するかは驚くべきことです。自然言語とランダム性の関係は、 entropy で表されます。典型的なパスワードの選択は一般に低エントロピーですが、完全にランダムな値には最大のエントロピーが含まれます。

一般的なパスワードのエントロピーが低いため、一般的なパスワードの比較的小さなデータベースのパスワードをユーザーが使用する可能性が比較的高くなります。それらをグーグルで検索すると、多くの場合ギガバイトサイズのカテゴリで、そのようなパスワードデータベースの急流リンクを見つけることになります。攻撃者が何らかの方法で制限されていない場合、このようなツールで成功するのは通常、数分から数日の範囲です。

一般的にハッシュとソルティングだけでは十分ではないのはそのためです。他の安全メカニズムもインストールする必要があります。 PKCS#5 で説明されているPBKDF2などのエントロピー誘導方法を人為的に減速して使用する必要があります。また、特定のユーザーに待機期間を強制する必要がありますパスワードの入力を再試行する場合があります。良い方法は、0.5秒から始めて、失敗するたびにその時間を2倍にすることです。ほとんどの場合、ユーザーはこれに気付かず、平均で3倍以上の頻度で失敗することはありません。ただし、アプリケーションを攻撃しようとする悪意のある部外者を大幅に遅くします。

115
emboss

パスワードが辞書の単語である場合と辞書の単語でない場合のブルートフォースの時間を知りたい。

辞書のパスワード

Ballpark figure:約1,000,000の英単語があり、ハッカーが1秒あたり約10,000のSHA-512ハッシュを計算できる場合(update:CodesInChaosのコメントを参照、この推定値は非常に低い)、1,000,000/10,000 =100秒。そのため、1人のユーザーの1つの単語の辞書パスワードを解読するには1分以上かかります。ユーザーがtwo辞書の単語を連結すると、数日以内にいることになりますが、攻撃者が十分に気をつけていればまだ可能です。それ以上に、それは難しくなり始めます。

ランダムパスワード

パスワードが大文字と小文字の英数字の真にランダムなシーケンスである場合、長さNの可能なパスワードの数は60 ^ N(60の可能な文字があります) )。今回は反対方向の計算を行います。 特定の長さの場合、どのくらいの長さのパスワードを解読できますか?この式を使用してください:

N = Log60(t * 10,000)ここで、tはハッシュを秒単位で計算するのに費やした時間です(ここでも1秒あたり10,000ハッシュを想定しています)。

1 minute:    3.2
5 minute:    3.6
30 minutes:  4.1
2 hours:     4.4
3 days:      5.2

したがって、3日間を考えると、5文字の長さのパスワードを解読できます。

これはすべて非常に球場ですが、あなたはアイデアを得る。 更新:以下のコメントを参照してください。これより長いパスワードをクラックすることは実際に可能です。

何が起きてる?

誤解を解きましょう:

  • ソルトはハッシュの計算を遅くしません、それは単に各ユーザーのパスワードを個別に解読する必要があることを意味し、事前に計算されたハッシュテーブル(バズワード:レインボーテーブル)は完全に役に立たなくなります。事前に計算されたハッシュテーブルがなく、パスワードハッシュを1つしか解読していない場合、ソルティングは違いを生じません。

  • SHA-512は、ブルートフォースが難しいように設計されていませんBCrypt、PBKDF2、またはSCryptなどのより良いハッシュアルゴリズムは、計算にはるかに時間がかかるように構成でき、平均的なコンピューターは1秒あたり10-20ハッシュしか計算できない場合があります。まだ読んでいない場合は この優れた答え パスワードハッシュについて読んでください。

  • 更新:CodesInChaosのコメントに書かれているように、適切なハードウェアを使用してSHA-512ハッシュを計算すると、高エントロピーパスワード(約10文字)でもブルートフォースされる可能性があります。


受け入れられた回答に関する注記:

2014年9月の時点で受け入れられている答えは間違っており、危険なほど間違っています。

あなたの場合、ハッシュアルゴリズムを破ることは、ハッシュアルゴリズムで衝突を見つけることと同等です。つまり、パスワード自体を見つける必要はありません(プリイメージ攻撃になります)...誕生日攻撃を使用して衝突を見つけるにはO(2 ^ n/2)時間かかります。ここで、nはハッシュの出力長ですビット単位の機能。

誕生日攻撃は完全に無関係与えられたハッシュをクラックすることです。実際、これはプリイメージ攻撃の完璧な例です。その式と次の数段落では、攻撃時間に対して危険なほど高い、まったく意味のない値が得られます。上記で示したように、数分で塩漬けの辞書パスワードを解読することは完全に可能です.

一般的なパスワードのエントロピーが低いため、一般的なパスワードの比較的小さなデータベースのパスワードをユーザーが使用する可能性が比較的高くなります...

一般的にハッシュとソルティングだけでは十分ではないのはそのためです。他の安全メカニズムもインストールする必要があります。 PKCS#5で説明されているPBKDF2など、エントロピーを誘導する人為的に減速した方法を使用する必要があります。

はい、計算が遅いアルゴリズムを使用してください。しかし、「エントロピー誘導」とは何ですか?ハッシュを介して低エントロピーパスワードを入力しても、エントロピーは増加しません。 preserve entropyである必要がありますが、ハッシュを使用してゴミのパスワードを改善することはできません。そのようには機能しません。 PBKDF2を介して入力された脆弱なパスワードは、依然として脆弱なパスワードです。

32
George Powell

変数が多すぎるため、この質問に対する答えは1つではありませんが、SHA2はまだ実際にはクラックされていません(参照: 暗号化ハッシュ関数の寿命 )。パスワードを保存します。ソルトを使用すると、 辞書攻撃 またはRainbowテーブルからの攻撃を防ぐことができます。ソルトの重要性は、パスワードごとに一意である必要があることです。ハッシュ化されたパスワードを保存するときに、[128ビットソルト] [512ビットパスワードハッシュ]のような形式を使用できます。

攻撃を行う唯一の実行可能な方法は、パスワードのさまざまな可能性についてハッシュを実際に計算し、最終的にハッシュを照合することで正しいパスワードを見つけることです。

1秒間にいくつのハッシュを実行できるかを理解するために、ビットコインは適切な例だと思います。 ビットコイン はSHA256を使用し、短くするために、より多くのハッシュを生成し、より多くのビットコインを獲得し(実際のお金と交換できます)、そのような人々はこの目的でGPUを使用するように動機付けられています。 ハードウェアの概要で を見ることができます。たった150ドルの平均的なグラフィックカードは、2億以上のハッシュ/秒を計算できます。パスワードが長く複雑であるほど、時間がかかります。 200M/sで計算し、8文字の英数字(大文字、小文字、数字)のすべての可能性を試すには、約300時間かかります。パスワードが適格なものであるか、一般的な英語の単語である場合、ほとんどの場合リアルタイムが短くなります。

そのため、セキュリティに関しては、コンテキストを確認する必要があります。攻撃者の動機は何ですか?アプリケーションの種類は何ですか?それぞれにランダムソルトを備えたハッシュを持つことは、数千のパスワードのようなものが危険にさらされる場合に対する非常に良い保護を提供します。

できることの1つは、ハッシュ手順をslowingでブルートフォース保護を追加することです。パスワードをハッシュするのは一度だけで、攻撃者は何度もそれをしなければならないので、これはあなたに有利に働きます。典型的な方法は、一定の反復回数で値を取得し、ハッシュし、出力を取得し、再度ハッシュすることです。たとえば、1,000回または10,000回の繰り返しを試すことができます。これにより、攻撃者が各パスワードを見つけるのが何倍も遅くなります。

8
Can Gencer