これを行う唯一の方法は、ブルートフォースアルゴリズムがどのように機能するか、またはおそらく機能するかについて、知識のある推測を行うことです。
たとえば、0〜9のノッチが10のディスク3枚の組み合わせロックをクラックしようとしていたとします。
私は000, 001, 002
から始めます。非常に複雑なクラッキングアルゴリズムを使用すると、最後の試行でクラックされるコードは999
なので、この場合は最強/安全です。
実際のアルゴリズムは、数値をインクリメントしたり、ASCIIテーブルを介して機能するだけではないと想定できます。
たとえば、3桁の数値コードを使用すると、クラッキングしようとするときに、123
の前に000
、111
、001
を試すほうがはるかによいでしょう。 一般的なピン番号
これは他のアスキー文字にも当てはまります
一般的なパスワード方法を使用して、「大文字1文字、特殊文字1文字、英数字を含む少なくとも8文字」ランダム*非常に強い8を作成しましたFs9@lw$a
の文字パスワード。
私の理論では、次のランダムな*強力なパスワードは、徐々に解読するのが難しくなるでしょう。
Fs9@k0$a
(パスワード)Fs9@k0$q
( "a"を英語の "q"の最も一般的でない文字に変更)FS9@K0$q
(小文字を大文字に変換し、小文字を1つ残します)FS5@K7$q
(一般的な番号を他の番号に変更)FS5&K7?q
(一般的な特殊文字を他の特殊文字に変更)*%.&K7?q
(大文字を特殊文字に置き換えて、1つの大文字を残します。*%5&K7?q
(数字を1つの数字を残して特殊文字に置き換えます。私は、「ブルートフォース耐性」のあるパスワードが持っているべき/持っていない特性の完全なリストを探しています。
リストの一番上がパスワードの長さであると想定します。例では、8文字だけを使用したのが理想的ですが、許可されている最大値を使用するのが理想的です。
ランダムに、いくつかの明確に定義された可能なパスワードのセットから等確率で選択することを意味する場合、パスワードの強度は、セットのサイズの関数です。あなたの例では、セットは3桁のシーケンス(000, 001, ..., 999
)のセットであり、このセットには1,000のメンバーがあるため、攻撃者は平均500回の推測で成功します。
私は
000, 001, 002
から始めます。非常に複雑なクラッキングアルゴリズムを使用すると、最後の試行でクラックされるコードは999
なので、この場合は最強/安全です。実際のアルゴリズムは、数値をインクリメントしたり、ASCIIテーブルを介して機能するだけではないと想定できます。
何も想定する必要はありません。あなたを混乱させているのは、与えられたランダムな選択に対して、平均よりはるかに早くそれを解読するいくつかの命令があるということです。たとえば、PINが999
であることがわかっている場合、降順ですべての組み合わせを試すアルゴリズムが最適です。
しかし、攻撃者はコードが999
であることを事前に知らないので、なぜそのアルゴリズムを選ぶのでしょうか?コードが000
である場合、これは999
のようです-後方反復アルゴリズムは最悪アルゴリズムです。 000, 999, 001, 998, ...
のような妥協を試みた場合、コードが500
の場合、それは本当に悪いことになります。
この引数は一般化されます。コードがランダムに選択され、すべてのコードが等しい確率を得て、攻撃者から秘密にされた場合、その後、攻撃者は、アルゴリズムが非常に少ない試行でコードを見つける確率と、相補的な悲観的な試行回数でコードを見つける確率を比較します。すべて平均します—セットにN
コードがある場合、攻撃者は平均してN/2
試行に成功します。
たとえば、3桁の数値コードを使用すると、クラッキングしようとするときに、
123
の前に000
、111
、001
を試すほうがはるかによいでしょう。 [一般的なピン番号へのリンク]
コードがランダムに一様に選択された場合(すべてのコードが等しく可能性があります)、そうではありません。
一方、コードがランダムに選択されない場合均一に(一部は他よりも選択される可能性が高い)、はい、一部の推測順序は他より早く終了します。これは、たとえば、実用的なパスワードクラッキングのしくみです。辞書やミューテーションルールなどは、ありそうでないパスワードよりも類似したパスワードを試すためのトリックです。
私の理論では、次のランダムな*強力なパスワードは、徐々に解読するのが難しくなるでしょう。 [...]
あなたは「ランダム」という言葉を使い続けますが、これが意味することをやめて慎重に考える必要があると思います。ここでの重要な概念は、 離散一様確率分布 です。コードがそのように選択されている場合、期間中に持つべき巧妙な順序のトリックはありません。
私は、「ブルートフォース耐性」のあるパスワードが持っているべき/持っていない特性の完全なリストを探しています。
2つのプロパティ:
それでおしまい。これらの要件を間違いなく満たす単純なシステムは Diceware です。 (パスフレーズがどれほど印象的であるかについていくつかの議論があり、いくつかの Wordリストへの提案された改善 。)
あなたは正しい:
これを行う唯一の方法は、ブルートフォースアルゴリズムがどのように機能するか、またはおそらく機能するかについて、知識のある推測を行うことです。
残念ながら、すべてのブルートフォースアルゴリズムが同じというわけではなく、ユーザーが生成したパスワードに対するブルートフォース攻撃を最適化する新しい方法が常に開発されています。 「ブルートフォース耐性」のパスワードが持つべき特性のリストを思いついた場合は、それらのパスワードを最初に試すブルートフォースアルゴリズムを簡単に記述して、実際にweaker他のパスワードよりも私のアルゴリズムに対して。
実際のところ、パスワードを総当たり攻撃に対して一般的に強力にするのは、特定の形式やルールのセットではなく、その予測不可能な程度です。パスワードの予測不能性を推定する1つの方法は、パスワードの生成に使用されたメソッドのentropyを決定することです。
パスワードエントロピーのしくみを説明するために、非常に単純なスキームを使用してパスワードを生成するとします。各パスワードを生成するには、コインを20回めくります。コインが表に出るたびに、パスワードに1を追加します。末尾に来るたびに0を追加します。これにより、20の1と0のランダムな文字列であるパスワードが生成されます。このシナリオでは、2つあります。20 可能なパスワード、およびそれぞれの可能性が等しく選択されている可能性が高いです。このパスワード生成方法にはログがあると言えます2(220)= 20ビットのエントロピー。 (かなり弱いですが、それはこの例の要点ではありません。)
次に、攻撃者がこのスキームを使用していること(最悪のシナリオ)を知っており、生成したパスワードの1つを解読しようとしていると想定します。 2つあるので20 可能なパスワードとそれぞれの可能性が等しく選択されている可能性が高い、それは攻撃者を連れて行きます220/ 2 = 219 〜= 524,288は平均してクラックを試みます。攻撃者は最初の試行または最後の試行で特定の個々のパスワードをクラックする可能性がありますが、攻撃者が最初に試行するパスワードを決定するために使用する戦略に関係なく、平均で常に524,288回試行されます。
この同じ方法を使用して、パスワードがランダムに選択される、ほぼすべてのパスワード生成スキームのエントロピーを推定できます。たとえば、一般的な英語の単語の7776語辞書からランダムに6つの単語を選択して(重複を許可して)パスワードを生成するとします。 (これは diceware で使用されるスキームです。)このスキームでは、パスワードにログがあります2(77766)〜= 77.55ビットのエントロピーで、〜2かかります77.54/ 2〜= 110セクシオンは平均してクラックを試みます。繰り返しますが、このスキームでは、攻撃者が考えられる各パスワードを試行する順序は重要ではありません。
Thomas Porninは、人気の「短い複雑なパスワード、または長い辞書のパスフレーズ?」の 彼の回答 で、パスワードエントロピーについて詳しく説明しています。質問。ぜひチェックしてみてください。
非常に狭い視点からこの非常に広範な問題に取り組んでいると思います。 「使用する文字」の詳細に入る前に考慮すべきことがたくさんあります。
まず、どのような脅威が心配されていますか? Yahoo!パスワードが悪用されますか?泥棒があなたのYahoo!彼は同じパスワードであなたの銀行口座の口座乗っ取りをしようとするパスワード?または、このパスワードはネットワークを保護していますか?ここには、外国のスパイの注目を集めている非常に貴重な企業秘密がありますか?
ほとんどの人にとって、2番目の種類の脅威は最も関連性があり、最も一般的です。侵害からパスワードを知った人は、多くの場合、さまざまな銀行やショッピングのWebサイトでパスワードを試します。これはアカウントテイクオーバー(ATO)と呼ばれ、パスワードがどれほど弱いか強いかは攻撃者には関係ありません。彼は数百のサイトのそれぞれであなたのメールアドレスとパスワードを試してみるだけで、彼が一致しない場合、彼は違反から得た次のメールとパスワードに移ります。この場合、ブルートフォースはパスワードの強度とはほとんど関係ありません。
この攻撃に対する最善の防御戦略は、パスワードを再利用しないことです。繰り返しになりますが、攻撃者が既に持っているため、それらがどれほど複雑であるかは問題ではありません。複数の場所で同じパスワードを使用していない限り、ゲームの前にいることになります。
また、この戦略は「クマを追い越すのではなく、あなたがいる相手を追い越す」に少し依存していることにも注意してください。攻撃者が盗んだ大規模なデータベースからパスワードの10%を回復した場合、彼はすでに持っているものを収益化することにもっと興味を持つかもしれません残りのパスワードを解読するために一生懸命働くよりも盗まれます。
しかし、攻撃者があなたのパスワードを望み、ブルートフォースを適用することにした場合を見てみましょう。攻撃者が、侵害されたデータベースから、またはシステムへのハッキングからパスワードのハッシュを取得し、パスワードの推測を試みたとします。彼は何ができる?
攻撃者を過小評価しないでください。 5年前、誰かがグラフィックカードの束をコンピューターに入れ、CUDAプログラムを作成して、パスワードハッシュをできるだけ速くテストしました。当時、彼のマシンは毎秒348,000,000,000ハッシュをテストできました。現代のグラフィックカードは今日さらに高速です。つまり、64文字の大文字、小文字、数字、および一般的な記号のセットからパスワードを選択すると、これらのリソースを持つ攻撃者は、考えられるすべての7文字のパスワードを13秒未満でテストできます。これはあなたの平均的な犯罪者の手の届かないところにあると思いますか?インターネット上でハイジャックされたPCのボットネットにアクセスできる泥棒は、10,000台のコンピューターに同時にパスワードを攻撃するように設定できます。これらのコンピューターの一部には、攻撃を加速するためのグラフィックカードが搭載されています。
つまり、セキュリティの慣行とパスワードの長さは、特定の文字、数字、記号の選択よりもはるかに重要です。少なくとも12文字のパスワードを選択してください。それ以外の場合は、少なくともパスワードの複雑さに関するサイトのガイドラインを満たします。また、パスワードを再利用しないでください。パスワードマネージャーアプリケーション、またはポケットの中にあるメモ帳さえも役立ちます。
それは総当たりスクリプトに依存します。 (あなたの例を使用するために)_001
_から_999
_までクラックを開始する場合、_999
_が最良のオプションですが、_999
_から開始する場合は最悪のオプションでもあります。したがって、各値がインクリメントまたはデクリメントされると想定する場合は、両方の中間にある値を使用することをお勧めします。そのためには、文字コードが必要です。 Pythonは、そのための便利な関数があります。たとえば、ord('A')
は65を生成し、chr(65)
は "A"を生成します。最初の数文字を設定することをお勧めします127に近い文字コード(0と255の中間)を持ち、長いパスワードを使用するシンボルに。
(しかし、私は xkcdの意見 が好きだと認めざるを得ません。)
簡単な答えは長さです。キャラクターごとに複雑さが増します。ランダムな文字を好きなように選択できますが、ランダムなパスワードをどのように選択したかが誰かにわかっている場合は、トリックを逆にしてパスワードを弱めることができます。
別のキャラクターを追加すると、突然200倍以上の可能な組み合わせがあります