web-dev-qa-db-ja.com

クラッカーはどのようにして200kのソルトパスワードハッシュを非常に速く再構築できますか?

私はウェブセキュリティについて少し話をしているところを調べていて、formspringのハックに関する記事を見つけたので、気になった。彼ら SHA-256 + saltを使用したと主張

セキュリティを強化するために、すぐに穴を修正し、ハッシュメカニズムをランダムなソルト付きのsha-256からbcryptにアップグレードしました(2012年7月10日)。

…それにもかかわらず、攻撃者 申し立て済み 400kの公開されたデータセット内に〜200kのパスワードを発見しました(1100万人のユーザーがいて、ほとんどがコピーされている可能性があります)。

400,000のハッシュの約半分は、パスワードクラッカーによってすでに再構築されています。 (2012年7月11日)

これは私には疑わしいようです。 PKCS#5または同様の手法を使用しないと、SHA-256のセキュリティが制限されることは知っていますが、非常に多くのパスワードをすばやく見つけるには、どれだけの計算能力が必要ですか?

私の推測では、formspringはハッシュについて嘘をついていました。誰かそれについて何か洞察がありますか?

33

既存の回答のどれも私の質問のこの重要な部分を満足させていません:塩はどうですか?

パスワードハッシュ値だけが投稿された場​​合、他のクラッカーはおそらく知ることができません。

  1. パスワードごとの(ソースごとにランダムと思われる)実際のソルト値。

  2. コードでソルトとパスワードをどのように混合するか。

彼らが持っているのは、最終的なハッシュです!

たくさんの方法 パスワードとソルトを組み合わせてハッシュを形成することができます:

sha256(pass + salt)
sha256(salt + pass)
sha256(sha256(pass) + sha256(salt))
sha256(pass + sha256(salt))
sha256(sha256(...(salt + pass + salt)...))

しかし、ソルトが 推奨される8文字 の場合、純粋なランダム性…

sha256("monkey1" + "w&yu2P2@")
sha256("w&yu2P2@" + "monkey1")

…これは、「典型的な」7または8文字のパスワードが極端に総当たりが困難になることを意味します。なぜなら、それは実質的に15文字以上です!さらに、あなたが知っているパスワードハッシュをクラックします。塩も持っている場合を除き、あなたは他に選択肢がありませんブルートフォース!

GPUクラッキングを使用して行った調査 に基づいて、2つのハイエンドATIカードでブルートフォースクラッキングMD5パスワードハッシュを使用して8213.6 M c/sを達成しました。私のベンチマークでは、これは私が試すことができることを意味しました:

all 6 character password MD5s   47 seconds
all 7 character password MD5s   1 hour, 14 minutes
all 8 character password MD5s   ~465 days
all 9 character password MD5s   fuggedaboudit

SHA-256は Hashcat を使用するGPU上のMD5の速度の13%であることに注意してください。したがって、これらの数値に約8を掛けて、どれだけ時間がかかるかを確認してください。

塩が知られていない場合は、基本的に、12文字以上のパスワードに相当する強引な強制を行っていることを意味します。 これは、既知の計算能力の領域をはるかに超えています。

今あなたがそれを主張したいなら…

  1. 元のクラッカーも塩を入手しましたが、投稿しないことにしました。

  2. originalクラッカーもソースコード(またはオープンソース)を持っているため、パスワードがどのようにソルトされるかを知っていますが、その情報を投稿しないことにしました。

  3. Formspringは嘘をついており、そのパスワードは無効化されていなかったため、無効化されていませんでした。

…はい、数日で200kの400kパスワードハッシュをクラックすることは簡単に可能です。

34
Jeff Atwood

編集:は業界標準のword salt(3rd行)

これがデータベースで頻繁にどのように表示されるかの例と同様に、この SHA-256 Unix Crypt 出力を見てください。

$5$rounds=80000$wnsT7Yr92oJoP28r$cKhJImk5mfuSKV9b3mumNzlbstFUplKtQXXMo4G6Ep5

.. どこ wnsT7Yr92oJoP28rは平文のソルトです。 Python Passlibのドキュメントには、多くの 一般的なハッシュパスワード形式 )の適切な説明があり、これらのほとんどは、ハッシュされたパスワード表現と連結された平文ソルトを格納します。

@Jeff Atwoodが論じている「unknown to the attackersalt」は、しばしば「コショウ」と呼ばれます。 パスワードハッシュを参照してくださいソルト+コショウを追加するか、ソルトで十分ですか?


2009年にDaniel J. Bernsteinは、NVIDIAのCUDAフレームワーク用に高度に最適化されたSHA-1実装を作成しました。当時、彼らは 4枚のグラフィックカードを使用して、単一サーバー で1秒間に6億9,000万SHA-1ハッシュを管理していました。

ハッシュされたパスワードに対するブルートフォース攻撃は、 「非常に並列」なワークロード です。 2010年、トーマスロスはAmazon EC2を使用して、 〜2 $ に対して〜10ハッシュをブルートフォース攻撃することを示しました。これは、レートが十分に高くない場合は簡単にスケールアップでき、EC2インスタンスを追加するだけです。

したがって、本質的には、パスワードをブルートフォースするのにどれくらいかかるかの問題ではありません。より早く結果を得るために、攻撃者がどれだけの計算能力を支払うか、支払うことができるかという問題です。

攻撃者は、約200.000個のパスワードを発見したと主張しました

合理的な説明の1つは、攻撃者は特定のハッシュ表現をターゲットにせず、「ぶら下がっている果物」を狙っただけだったことです。言い換えると、彼らは「推測しやすい」パスワードだけを探しました。おそらく次のようなものです:

  • 実際のユーザーパスワードの公開リストから作成された、プレーンテキストの最も一般的なパスワードの候補リスト。 (何年にもわたって、実際のユーザーパスワードが( )漏えいしてきました )。
  • そしておそらく、さらに上限まで、たとえば6文字まで、すべての発音可能な小文字のパスワードを試しました。 (上記の2006年のMySpaceデータセットでは、すべてのエンドユーザーパスワードの17%が6文字以下であることがわかりました。)

私の推測では、formspringはハッシュについて嘘をついていました。

リンクを正しく理解できれば、7月7日のフォーラムでハッシュが発見されました。しかし、彼らはその数週間または数か月前にFormspringから盗まれた可能性がありますか?

上記で説明したことを考えると、Formspringが言ったように、パスワードごとに一意のソルトを持つSHA256の単一のラウンドが使用されたことは不当に思えません。

それはすべて、攻撃者がブルートフォースのクラッキングに費やした時間と労力に依存します。しかし、個々のハッカーの小さなグループが持つ可能性のあるリソース内では、1100万の単純なSHA-256ハッシュ表現のデータセットから200.000の弱いパスワードを発見することはもっともらしいようです。

16
Jesper M

無塩ハッシュを解読するのはかなり簡単です。事前に計算されたテーブルでハッシュを検索し、答えを見つけるだけです。 Rainbowテーブルがブルートフォース辞書をすでにカバーしているため、残りをブルートフォースで強制する必要はありません。

しかし、ソルトされたパスワードを解読することはまだ簡単です。遅いですが、それでも簡単です。ほとんどのブルートフォース攻撃では、攻撃者は深さではなく幅を広げます。 1つのアカウントに対して10億のパスワードを試行するのではなく、すべてのアカウントに対して数十、数百、数千の一般的なパスワードを試行します。確かにRainbowテーブルの方が高速ですが、ソルトだけでは従来のブルートフォース手法が妨げられることはありません。辞書の先頭から始めて、すべてのアカウントに対してそのパスワードを試してください。これには、明らかに各アカウントのハッシュを再計算する必要がありますが、一方で、ヒットする可能性はかなり高くなります(これがまさに「一般的なパスワード」の意味です)とにかく)。次に、最も一般的なパスワードを使用し、次に次のパスワードを使用します。

結局、数千のパスワードしか取得できない可能性がありますが、統計的に言えば、リストに「123456」というパスワードを持つアカウントが数百あり、「password1」と「111111」と「test」を使用するかなり多数のアカウントがあります。 。

11Mのうち200Kは信じられません。約2%のみ。 400Kのうち200Kは少ない。不可能ではないが可能性は低い。リターンの減少の法則がどこかでキックしています。どれくらい遠いのかはわかりませんが、おそらく1/eなどの非常に単純な比率でしょう。それ以上に懐疑的になります。

8
tylerl

彼らが嘘をついていないのは理にかなったことです。

  1. @ Jeffが言及 高速クラッキングにはソルトへのアクセスが不可欠ですが、@ Remus Rusanuが指摘したように、「ハッシュを取得した場合、どのようにしてソルトを取得できなかったかを知るのは困難です。それらは互いに関連付けることができるような方法で保存する必要があるためです。少なくとも、最初のハッカーはソルトにアクセスできたと思います。1

  2. @Jeffはまた、ソルトとパスワードがどのように組み合わされているかを知るために、ソースコードにアクセスできる必要があるとも述べています。 saltとパスワードがどのように組み合わされているかを調べるために、別のアプローチを提案します。

    1. 彼らが攻撃の前にformspringアカウントを持っていると仮定しましょう(かなり合理的な仮定)
    2. 取得したリストでその特定のアカウント(塩、ハッシュ)を探します
    3. パスワード、ソルト、および結果として得られるハッシュを知っているので、小さなスクリプトを作成して、パスワードとソルトを組み合わせる合理的な(そして不合理な)方法をすべてテストするのは簡単です(数千以上の方法はありませんか?)
    4. ???
    5. 利益!
  3. 彼らは、@ Jesper ローハンギングフルーツ 理論を非常に合理的にする "数千万のメンバー"を持っていると主張しています。

OK、彼らはまだ嘘をついているかもしれませんが、少なくとも嘘をついているのは理にかなっているようです。

1.この仮定が間違っている場合-最初のハッカーはソルトを公開せず、パスワード自体を解読しようとしませんでした-残りは可能性があります可能です。

7
João Portela

hashcat は、Radeon HD7970で毎秒10億を超えるSHA256ハッシュを実行できます。これは、SHA1の半分の速度とMD5の4分の1の速度にすぎません。ただし、これは ボトルネック でもありません。

次に進む前にもう1つ。クラッキングの速度が1秒あたり258.7Mに過ぎないことに気付きましたか?毎秒数十億のSHA1ハッシュの理論的なスループットはどうなりましたか?問題は、より高いスループットが、パスワードディクショナリ値の「変更」を使用するか、GPU内で直接さまざまなパスワードの可能性を処理することによってのみ達成できることです。言い換えると、GPUにディクショナリ値を取得させると、それをさまざまな可能性に変換して、より高速に動作させることができます。同じレベルのスループットを達成するのに十分な速度でGPUにパスワードを供給することができないため、パスワードのリストを効果的に取得することがボトルネックになります。

したがって、SHA256(またはSHA512)を使用することは、このような種類の攻撃に対してSHA1またはMD5を使用することよりも安全ではありません。

4
mgorven

どちらの投稿も、加害者がFormspringソースコードにアクセスしたかどうかについては触れていません。これが事実である場合、攻撃者はハッシュ構築の方法とソルトのランダム生成を利用できます。これにより、特に「ランダム」塩を生成する方法で塩を比較的小さな設定値に制限した場合に、クラックのタスクが大幅に容易になります。

この限られたセットが解読された見かけの速度を考えると、私の推測ではこれが当てはまると思います。

3
mitchellrj

パスワードごとに固有のソルトを持つハッシュを使用している場合、これらのパスワードを解読するまでには通常かなりの時間がかかります。パスワードが非常に弱い場合や、パスワードが辞書の単語である場合を除きます。純粋な総当り攻撃は、もし強力であれば、少しありそうにありません。

トムのハードウェアには GPGPUパスワード クラックに関する記事があります。弱いパスワード(大文字、小文字、記号などを含む10文字以上(ではない)は、ソルトを使用しても数分で解読できる塩がわかっている場合。

それ以外の場合は、何日、何ヶ月もかかり、長いパスワードでも数千年かかります。しかし、これは塩なしです。塩だと永遠にかかります。

1
Lucas Kauffman