web-dev-qa-db-ja.com

パスワードを簡単に解読できるのはなぜですか?

PHPを使用してデータベースにパスワードを保存します。

return hash('sha256', PASSWORD_SALT . $password);

最近(幸いなことに)良いハッカーがSQLを注入し、管理者パスワードを含むいくつかのパスワードをクラックしました。

彼が私たちに穴を指摘するのに十分親切だったので、物語はハリウッド映画のように劇的にまたはひどく終わっていませんでした。 (それに応じて私たちは彼に「感謝」しました。)

穴にパッチが適用されたので、コードベースが大きいため、別の場所にいくつかの穴がある可能性があります。質問は次のとおりです。

  • 彼はいったいどのようにしてパスワードをそれほど速く解読したのですか(数時間から1日未満)。 PASSWORD_SALTは非常に長く、ソースコードに格納されており、彼は持っていませんでした。また、PHPコードでは空白のパスワードは使用できません。
  • 既存のパスワードと将来のパスワードのハッシュ/暗号化を変更する必要があると想定しています。公開されたパスワードをより安全にするために、どの暗号化を推奨しますか?

彼は彼が彼の会社で彼が利用できるいくつかのソフトウェアと数十のデスクトップマシンを使っていると私たちに話しました。彼はある大企業の退屈なセキュリティ専門家なので、何かをする手段を持っていると彼は言った。

9
Phung D. An

まず、あなたが呼ぶものPASSWORD_SALTは実際には塩ではありません。ソルトはパスワードごとに異なり、データベースに格納されます。あなたが持っているのは、すべてのパスワードで共有され、ソースコードに保存されているものです。これは一般的に唐辛子と呼ばれています。

では、攻撃者はコショウを知らないまま、どのようにしてパスワードをすばやく解読したのですか?彼はおそらく自分用に新しいユーザーを作成したため、パスワードを知っているユーザーが1人います。彼はそれから、そのパスワードを連結する必要があるパスワードを知っているので、そのユーザーにペッパーを力ずくで試行することができます。ここでの鍵は、彼が唐辛子とパスワードを同時に解読する必要がないことです。彼は最初に唐辛子を解読し、次にパスワードを解読することができます。これははるかに簡単です。

SHA-256の1回の反復は、良いパスワードハッシュアルゴリズムではありません。断食する方法です。 8x Nvidia GTX 1080セットアップのこれらのベンチマーク によると、毎秒約20億のハッシュを試すことができます。攻撃者に12時間を与えると、ほぼ10時間になります。14 ハッシュ。平均して、それは丸太でコショウを割るのに十分です2(1014)-1 = 45ビットのエントロピー。これは、たとえば10個のランダムな小文字に対応します。

コショウを入手したら、パスワードの解読を開始できます。彼らはおそらくコショウよりも低いエントロピーを持っているので、それははるかに速いはずです。

パスワードのハッシュを正しく行う方法については、 この質問 を参照してください。

16
Anders

いったいどのようにしてパスワードをクラックしたのか(数時間から1日未満)、PASSWORD_SALTは非常に長く、ソースコードに格納されていましたが、持っていませんでした。また、空白のパスワードはPHPコードでは受け入れられません

まあ、私は彼がGPUを組み込んだ1台以上のコンピューターを使用したと確信しています。多分彼はCLIモードで複数のGPUを実行しています。つまり、GTX1080のような複数のGPUが1つの操作で同じタスクを実行するということです。この場合、パスワードリストからSHA256の文字列をハッシュし、データベースで見つけたハッシュされたパスワード文字列と比較します。

GTX1070が1秒間にハッシュして比較できるパスワードの数の例を示すために、私が見つけたこのブログを参照します: https://hashcat.net/forum/thread-5440-post-31067。 html

この例では、テスターはEVGA GeForce GTX 1070 SC GAMING ACX 3.0on aWindows 7システム。GPUは、SHA256アルゴリズムの2117.4 MH /秒を「クラック」することに成功しました。

次に、少なくともいくつかのパスワードを解読し、それらを互いに比較して、ソルトを判別できる場所を探します。ソルトがどのように見えるかを知っていると、彼は新しいパスワードリストを作成しました。 saltから始めて、通常のパスワードリストを続けます。


既存のパスワードと将来のパスワードのハッシュ/暗号化を変更する必要があるとします。公開されたパスワードをより安全にするために、どの暗号化を推奨しますか?

ハッカーがハッシュされたパスワードを取得できる場合、ハッシュアルゴリズムによっては、ほとんどのパスワードを復号化するのにかかる時間に依存します。アルゴリズムはお勧めしません。アルゴリズムは計算能力と読み込み時間に大きく依存するためです。ただし、SHA256よりも強力なアルゴリズムを知りたい場合は、パスワードクラッキングベンチマークを確認してください。 https://Gist.github.com/epixoip/a83d38f412b4737e99bbef804a270c4

強力なパスワードポリシー。クラッキングプロセスを遅らせたり、ハッカーが正しいパスワードを推測できないようにする別の方法です。

2
ZiY5kE

状況についてのあなたの説明が正確で信頼できるものであるかどうか私は懐疑的です。特に、このビットを信じることは本当に難しいと思います:

PASSWORD_SALTは非常に長く、ソースコードに格納されており、彼は持っていませんでした。

私はこれをPASSWORD_SALTは秘密であり、攻撃者が実際の時間内に推測することは不可能である(技術的には、エントロピーが高い)と主張しました。しかし、この主張を認めた場合、攻撃者はSHA-256の preimage resistance を打ち負かしたと結論する必要があります。つまり、ハッシュ関数の実質的にランダムな出力値しか与えられなかったため、攻撃者はその出力を生成する入力を見つけます。そして、そのような入力の1つだけではなく、たまたま、おそらく秘密で、長く予測できないPASSWORD_SALTが前に付けられます。

しかし、もちろん、あなたのハッカーは実際にはSHA-256の壊滅的なブレークを発見しませんでした。ですから、あなたの状況理解は不正確だと思います。どちらか:

  1. ハッカーは実際になんとかコードを見て、PASSWORD_SALTの値を知りました。
  2. PASSWORD_SALTの値は、パスワードクラッキングに通常適用されるのと同じ方法を適用することで、実際には簡単に推測できます。攻撃者が既知のパスワードでアカウントを作成した可能性があるというアンダースの回答の提案は、これを行うためのもっともらしい方法です。パスワードについての知識が与えられれば、低エントロピーソルトを解読することは、塩。

既存および将来のパスワードのハッシュ/暗号化を変更する必要があると想定しています。公開されたパスワードをより安全にするために、どの暗号化を推奨しますか?

PHPを使用している場合、最近のバージョンには 優れた組み込みパスワードストレージ機能 があります。

1
Luis Casillas