LinkedInハックパスワードジェネレーター/バリデーター

LinkedInの一致したパスワードを分析した後、簡単に一致するパスワードを許可しないバリデーターと組み合わせて、パスワードジェネレーターを作成するというアイデアが生まれました。 長さの最も単純な分析、特殊文字の存在はここでは十分ではありません-一部のパスワードは非常に可能性の高い「ピース」から簡単に収集でき、理論的に述べられているものよりもはるかに短い時間で整理できます。 また、ジェネレータプログラムがそのようなパスワードを提供しないという保証はありません-事故、それは事故です。 私の作成は、問題の完全な解決策のふりをするのではなく、反省の機会ですが、かなり機能的です(ソースコードと少しの分析もあります)。



信頼性と信頼性


最初は、このアイデアを一種のWebサービスとして作成したかったのですが、もっとよく考えました。 有能なユーザーは最初に自分の可能なパスワードがどこにあるのかを考える必要がありますが、ネットワークテクノロジーの場合、この質問には明確な答えがなく、そのようなサービスをまったく信用しない理由がすべてあります。 パスワードの入力が完了し、AJAX'omが既に取得され、サーバーに保存されています。 結構です



未知のデスクトップアプリケーションは、この点では優れていません。静かにリクエストをインターネットに送信する多くの機能があります。 このため、私は自分でジェネレータープログラムを使用しません。 また、エントロピーのソースの膨大なリストにもかかわらず、パスワードが誰かのデータベースにないという保証はありません。



したがって、私自身はソースコードでプログラムを提案し(C#では、開発に数時間以上費やしたくないという事実に基づいて)、ソースからビルドすることを強くお勧めします。



パスワード生成


最も単純で最も普遍的な生成スキームは、エントロピーを取得し、特定の文字セットでターゲット長の文字列に変換することです。



変換のためのかなり標準的なソリューションがあります。これは、エントロピープールの効果的な畳み込み(つまり、ランダムな値)としてハッシュ関数を呼び出すことになります。



string generatePassword(string charset, int length) { byte[] result; SHA1 sha = new SHA1CryptoServiceProvider(); result = sha.ComputeHash(seed); // <---    // create password StringBuilder output = new StringBuilder(); for (int i = 0; i < result.GetLength(0) && output.Length < length; i++) output.Append(charset[result[i] % charset.Length]); // update seed for (int i = 0; i < result.GetLength(0); i++) addToSeed(result[i]); return output.ToString(); }
      
      







ランダム値自体は、さまざまな方法で入力できます。



しかし、最初の3つの点は理想的には完全に冗長であると考えていますが、実際には予測も不十分です。 ハードウェアセンサーが破損せず、「同じもの」を提供しないという確実性はありません。システムの環境は十分に動的ではない可能性があり、インターネットサービスは個人的な利益のために生成されたデータを明確に返します(そして保存します)。 これらは乱数であり、それらを見る機会さえありますが、何も理解できません。



そのため、データを使用することが決定されました。取得プロセスはユーザーに依存します。最も簡単で便利なオプションの1つは、マウスの動きを保存することです。 各動きは座標と時間で特徴付けられますが、一般的には予測できますが、特定の数で、特に区別でき、ほとんどランダムです(特に、高解像度のカウンターで時間を測定する場合(プロセッサティック))。



 void handleMouseData(int x, int y) { /* store information in seed array */ addToSeed(x); addToSeed(y); addToSeed(ticks()); }
      
      







環境からのエントロピーの形成に関連するコードの小さな部分は、この単純な関数に含まれています。



 int ticks() { long timer; if (QueryPerformanceCounter(out timer) == false) { // high-performance counter not supported throw new Win32Exception(); } /* ignore significant bits due its stability - we prefer using fast-changing low bits only */ return (int)timer; }
      
      





QueryPerformanceCounterカウンターの解像度はシステムによって異なり、その値は現在のプロセッサー負荷、プロセス数、コンテキスト切り替えの事実によって変化します。 1つの量。予測される成長を示しますが、特定の数では表現するのが非常に困難です。



その結果、ユーザーにいくつかの巧妙な組み合わせをクリックさせることなく、生成の終了まで数時間待つことなく、プログラムの複雑なインターフェースに苦しむことなく、良いパスワードを取得します。 私はインターフェイスのデザインにきちんとしたふりをしません(下のスクリーンショットを実現するとさらに面白くなってきました)が、ComboBoxでつついて生成されたオプションから好きなものを選択するよりも便利な解決策はないと思います。







ハッキング時間の見積もり


直接列挙の場合、合計時間は次のパラメーターに基づいて計算できます。



アルファベットの力は、特定のパスワードの文字を含む最小限の(合理的な説明基準を使用した)セットです。 通常、これらはフォームのセットです。



したがって、時間を計算するには、パスワードのセットに含まれる文字を確認し、すべての文字をセットのパワーに含めます。

 double bruteforceCombinations = Math.Pow(26 * upper + 26 * lower + 10 * numeric + specials.Length * special, pwd.Length);
      
      





ハッシュ速度はアルゴリズムごとに異なります。一般的な方法の概算値のリストを提供します(ただし、実際にはサーバーで使用されている方法はわかりません。したがって、最も人気のあるアルゴリズムのうち、最速のMD5のみを残す方が正確です)。



ムーアの法則を忘れないでください。これが、「何百万年もクラックする」と主張するすべての計算が非常に素朴に見える理由です。 計算能力の成長ダイナミクスを確実に予測することはできませんが、現在の成長率を使用することは、何もしないよりはましです。



そして実際、主なことは、 分解によって攻撃時間を推定することです。



これはそれほど難しくありません。パスワードの最小の内訳を、関連する組み合わせの辞書の単語(多くの場合、部分文字列)==パスワードの長さに分割するだけで十分です。 そして、辞書の「パワー」を計算します==その中の単語の数。 組み合わせの総数は、長さの程度でまだ「パワー」です。



パスワードが「Good123Password」の場合、「Good」、「123」、「Password」に分解されます。これらは個別に非常に一般的であり、繰り返し処理に必要な時間はキューブ内で「ごくわずか」です。



もちろん、問題はそのような辞書の品質ですが、繰り返しますが、オプションは何もないよりはましです。 LinkedInでの監査の後に取得した辞書をプログラムに添付しました。これは、250万のパスワードで見つかった最も頻繁な組み合わせで構成されています。 辞書自体はわずか40キロバイトです。



結果


プログラムとソースへのリンク: dl.dropbox.com/u/243445/md5h/pwdmaster.zip



良い結果の1つは、疑似ランダムに生成されたパスワードのほとんどが、考えられる組み合わせに分解されないという事実です。 他のプログラムで発電機に明らかなエラーや抜け穴がなく、発電品質が私のものより悪くない場合、「あなたはぐっすり眠れる」。 辞書に表示される14文字の英数字の組み合わせに対するパスワードの割合は(辞書検索が直接検索よりも高速になるように)1000分の1未満です。



All Articles