パスワードのエントロピーを推定するにはどうすればよいですか?


14

パスワードの強度に関するさまざまなリソースを読んで、パスワードのエントロピーの大まかな推定値を提供するアルゴリズムを作成しようとしています。

できるだけ包括的なアルゴリズムを作成しようとしています。この時点では、擬似コードしかありませんが、アルゴリズムは次のことをカバーしています。

  • パスワードの長さ
  • 繰り返されるキャラクター
  • パターン(論理)
  • 異なる文字スペース(LC、UC、数値、特殊、拡張)
  • 辞書攻撃

以下をカバーしておらず、完全にカバーすべきではありません:

  • 順序付け(このアルゴリズムの出力により、パスワードを厳密に順序付けることができます)
  • パターン(空間)

誰でもこのアルゴリズムの弱点についての洞察を提供できますか?具体的には、アルゴリズムにパスワードを入力するとその強度が過大評価される状況を誰もが考えられますか?過小評価は問題ではありません。

アルゴリズム:

// the password to test
password = ?
length = length(password)

// unique character counts from password (duplicates discarded)
uqlca = number of unique lowercase alphabetic characters in password
uquca = number of uppercase alphabetic characters
uqd   = number of unique digits
uqsp  = number of unique special characters (anything with a key on the keyboard)
uqxc  = number of unique special special characters (alt codes, extended-ascii stuff)

// algorithm parameters, total sizes of alphabet spaces
Nlca = total possible number of lowercase letters (26)
Nuca = total uppercase letters (26)
Nd   = total digits (10)
Nsp  = total special characters (32 or something)
Nxc  = total extended ascii characters that dont fit into other categorys (idk, 50?)

// algorithm parameters, pw strength growth rates as percentages (per character)
flca = entropy growth factor for lowercase letters (.25 is probably a good value)
fuca = EGF for uppercase letters (.4 is probably good)
fd   = EGF for digits (.4 is probably good)
fsp  = EGF for special chars (.5 is probably good)
fxc  = EGF for extended ascii chars (.75 is probably good)

// repetition factors.  few unique letters == low factor, many unique == high
rflca = (1 - (1 - flca) ^ uqlca)
rfuca = (1 - (1 - fuca) ^ uquca)
rfd   = (1 - (1 - fd  ) ^ uqd  )
rfsp  = (1 - (1 - fsp ) ^ uqsp )
rfxc  = (1 - (1 - fxc ) ^ uqxc )

// digit strengths
strength =
( rflca * Nlca + 
  rfuca * Nuca +
  rfd   * Nd   +
  rfsp  * Nsp  +
  rfxc  * Nxc    ) ^ length

entropybits = log_base_2(strength)

いくつかの入力と、それらの望ましいおよび実際のentropy_bits出力:

INPUT           DESIRED        ACTUAL
aaa             very pathetic  8.1
aaaaaaaaa       pathetic       24.7
abcdefghi       weak           31.2
H0ley$Mol3y_    strong         72.2
s^fU¬5ü;y34G<   wtf            88.9
[a^36]*         pathetic       97.2
[a^20]A[a^15]*  strong         146.8
xkcd1**         medium         79.3
xkcd2**         wtf            160.5

* these 2 passwords use shortened notation, where [a^N] expands to N a's.
** xkcd1 = "Tr0ub4dor&3", xkcd2 = "correct horse battery staple"

アルゴリズムは(正しく)アルファベットサイズを(1桁でも)増やすと、長いパスワードが大幅に強化されることを認識します。大文字。ただし、36 aのパスワードを持っているのは良い考えではなく、弱いパスワードクラッカーで簡単に壊れてしまうという事実を説明しておらず(また、入力を監視する人はそれを見るでしょう)、アルゴリズムはそれを反映していません。

ただし、xkcd1はxkcd2に比べて複雑な密度が高いにも関わらず弱いパスワードであるという事実を反映しています(これも問題ですか?)。

このアルゴリズムを改善するにはどうすればよいですか?

補遺1

辞書攻撃とパターンベースの攻撃は大きなことのように思えるので、それらに対処するために刺します。

単語リストの単語をパスワードで包括的に検索し、単語が表す単語に固有のトークンで単語を置き換えることができます。ワードトークンは文字として扱われ、独自の重みシステムを持ち、パスワードに独自の重みを追加します。いくつかの新しいアルゴリズムパラメータが必要です(lw、Nw〜= 2 ^ 11、fw〜= .5、rfwと呼びます)。他のいずれかと同様に、パスワードに重みを含めます。重み。

この単語検索は、大文字と小文字の両方に加えて、Eの3のような一般的な文字置換に一致するように特別に変更できます。単語ごとに2つ、これは問題ありません。そうでなければ、一般的なルールは、完全ではない文字の一致ごとに、単語にボーナスビットを与えることです。

次に、繰り返される文字の実行の検索や、「aaaaa」や「12345」などのパターンを特定する派生テスト(各文字の差を取る)などの単純なパターンチェックを実行し、検出された各パターンをパターンに置き換えますトークン。パターンと長さに固有です。アルゴリズムのパラメーター(具体的には、パターンごとのエントロピー)は、パターンに基づいてオンザフライで生成できます。

この時点で、パスワードの長さを取得します。各単語トークンとパターントークンは1文字としてカウントされます。各トークンは、それらが象徴的に表す文字を置き換えます。

何らかのパターン表記を作成しましたが、パターンの長さl、パターンの順序o、ベース要素bが含まれています。この情報を使用して、各パターンの任意の重みを計算できます。実際のコードではもっと良いことをしたいと思います。

変更された例:

Password:          1234kitty$$$$$herpderp
Tokenized:         1 2 3 4 k i t t y $ $ $ $ $ h e r p d e r p
Words Filtered:    1 2 3 4 @W5783 $ $ $ $ $ @W9001 @W9002
Patterns Filtered: @P[l=4,o=1,b='1'] @W5783 @P[l=5,o=0,b='$'] @W9001 @W9002

Breakdown:         3 small, unique words and 2 patterns
Entropy:           about 45 bits, as per modified algorithm

Password:          correcthorsebatterystaple
Tokenized:         c o r r e c t h o r s e b a t t e r y s t a p l e
Words Filtered:    @W6783 @W7923 @W1535 @W2285

Breakdown:         4 small, unique words and no patterns
Entropy:           43 bits, as per modified algorithm

エントロピーがパターンからどのように計算されるかについての正確なセマンティクスは議論の余地があります。私は次のようなものを考えていました:

entropy(b) * l * (o + 1) // o will be either zero or one

変更されたアルゴリズムは、元のテーブルの各パスワードの欠陥を検出し、強度を低下させますが、例外はs^fU¬5ü;y34G<、単語やパターンを含まないことです。


2
tech.dropbox.com/?p=165を見ましたか?それはあなたにいくつかのアイデアを与えるかもしれません。dl.dropbox.com/u/209/zxcvbn/test/index.htmlにデモがあり、コードはgithubにあります。


一つの選択肢は、圧縮アルゴリズムを介してそれらを実行すると、彼らは圧縮どれだけ見ることかもしれないが、ここでの唯一の難点は、最も圧縮ALGOSは、大量のデータを持つ仕事に設計されている、あなたは、少量のデータのための1つの必要があるということです
JKを。

1
@mouviciel:私はあなたをパンチで打ちました。最初の行を読んでください:D
12

@Wug-すばらしい!私はリンクをたどりませんでした。さまざまなリソースがそのような研究をカバーしているとは想像できませんでした!
mouviciel

回答:


9

NIST SP 800-63の p46の付録Aには、多数のビットを使用してパスワードエントロピーを推定するClaude Shannonの研究が記載されています。実際、これは、XKCD漫画がエントロピービットを計算するために使用するドキュメントです。具体的には:

  • 最初の文字のエントロピーは4ビットと見なされます。
  • 次の7文字のエントロピーは1文字あたり2ビットです。これは、「8文字を超えない範囲の統計効果が考慮される場合、エントロピーは文字あたり約2.3ビットである」というシャノンの推定とほぼ一致しています。
  • 9番目から20番目の文字では、エントロピーは1文字あたり1.5ビットと見なされます。
  • 文字21以上では、エントロピーは文字ごとに1ビットと見なされます。
  • 6ビットのエントロピーの「ボーナス」は、大文字とアルファベット以外の文字の両方を必要とする構成規則に割り当てられます。これにより、これらの文字の使用が強制されますが、多くの場合、これらの文字はパスワードの先頭または末尾でのみ発生し、全体の検索スペースが多少減少します。パスワード;
  • 広範な辞書チェックのために、最大6ビットのエントロピーのボーナスが追加されます。攻撃者は辞書を知っている場合、それらのパスワードのテストを回避でき、いずれにしても辞書の大部分を推測できますが、辞書ルールがない場合は最も選択されたパスワードになります。憶測できる長いパスワードは辞書の単語で構成される「パスフレーズ」でなければならないため、辞書テストの推測エントロピーの利点のほとんどは比較的短いパスワードになるため、20でボーナスがゼロになる文字。

これは、認証システムが特定のエントロピーレベルをしきい値として選択するという考え方です。たとえば、10ビットが弱い、20が中、30が強い(推奨ではなく、例として任意に選択された数値)。残念ながら、この文書ではこのようなしきい値を推奨していません。おそらく、ブルートフォースまたはパスワードの推測に使用できる計算能力が時間とともに増加するためです。

任意の特定のルールセットを課す代わりに、認証システムは上記のルールを使用してユーザーパスワードを格付けし、最小エントロピー標準を満たすものを受け入れます。たとえば、少なくとも24ビットのエントロピーを持つパスワードが必要だったとします。「IamtheCapitanofthePina4」のエントロピー推定値を計算するには、文字列に23文字が含まれ、大文字とアルファベット以外の文字を必要とする構成規則を満たすことを観察します。

これはあなたが探しているものかもしれませんし、そうでないかもしれませんが、他に何もないとしても悪い基準点ではありません。

[編集:以下を追加しました。]

発表された大量のパスワードを攻撃することによるパスワード作成ポリシーのメトリックのテスト(Matt Weir、Sudhir Aggarwal、Michael Collins、Henry Stern)は、上記のシャノンモデルは、人間が生成したパスワードのエントロピーの正確なモデルではないことを実証しました。より正確な提案については、「セクション5新しいパスワード作成ポリシーの生成」を参照することをお勧めします。


3
パスワードの強度に関するウィキペディアの記事では、これらのルールは人間が生成したパスワードに対して正確ではないことが判明しています。
リャサル

1
True(興味深い読み物についてはgoo.gl/YxRk)。
アクトン

もちろん、これには1つの注意点があります。統計的に典型的なパスワードの場合、かなり正確である可能性があります。パスワードは、人であるため特定のルールに従う傾向があります。これらのガイドラインでは、ランダムに生成されたパスワードは、パターンや単語を(おそらく)含まないため、通常の長さで人間が生成したパスワードをはるかに上回るという事実を考慮しません。
ワグ

4

このページの下部にあるKeePassのソースコードをご覧ください。このQualityEstimationクラスは、適切なアルゴリズムを実装しています。これは、適切なアルゴリズムを実装しているようです。私の結果は次のようになります:

aaa                              8
aaaaaaaaa                        9
abcdefghi                       18
H0ley$Mol3y_                    73
s^fU¬5ü;y34G<                   99
[a^36]*                         10
[a^20]A[a^15]*                  18
Tr0ub4dor&3                     66
correct horse battery staple    98

これは、エントロピーまたはおそらく他の指標、たとえばボゴフィット性を計算しますか?また、[a ^ 36]を「aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa」に展開したことを覚えていますか?
ワグ

えー、いや、私はこれらの文字列を逐語的にコピーしました:(一見正規表現ではなく、特殊文字のクールな使用だと完全に思いました。もう一度ショットを与えて更新します。次に、エントロピーのビットを計算します。
ジェシーC.スライサー

1
正規表現ではなく、25文字
ずつ

2
'enfatten'のコメントを+1する必要がありました。この状況を完璧に表現しているようです。
ジェシーC.スライサー

1
実際には、「KeyPass」ではなく「KeePass」と綴られています。(...私は編集私自身作ると思いますが、彼らがより6つの文字でなければならない)
イアン・ダン

1

あなたが尋ねる

具体的には、アルゴリズムにパスワードを入力するとその強度が過大評価される状況を誰もが考えられますか?

しかし、あなたは質問に例を持っています。設計上、xkcd2のエ​​ントロピーは最大44ビットですが、推定値は160.5ビットです。


したがって、一般化すると、単語、または他の文字よりも使用される可能性がかなり高い文字の組み合わせを考慮すると、アルゴリズムは機能しなくなります。また、標準的なxkcdの例にはスペースが含まれておらず、私の計算には含まれていたことも指摘します。
ワグ

@Wug、それは公正な一般化です。これはzxcvbnが取り組んでいるもので、この質問の最初のコメントで言及されています。
ピーターテイラー

1

誰もがこのアルゴリズムの弱点についての洞察を提供できますか?具体的には、アルゴリズムにパスワードを入力するとその強度が過大評価される状況を誰もが考えられますか?

前文の一部(辞書攻撃など)を示唆しました。基本的に、攻撃者が推測できる多くの一般的な慣行があり、検索スペースが大幅に低下します。あなたのアルゴリズムが以下を「過大評価」することは間違いありません。

  • どこにでも
  • どこにでも
  • どこでも1

パスワードは非常に長くなりますが、元の単語が基本的な辞書に表示されるため、簡単に解読できます。また、変更は一般的な辞書攻撃の一部を形成するのに十分一般的であると考えられます。一般的な文字->数値変換(3v3rywh3r3など)も非常に弱いと見なされるべきであり、これらに対してペナルティを科す必要があります。

それほどではないが、他のトラブルパスワードは、次のような明らかなパターンを持つパスワードである場合があります。

  • abcdefghijklmnop
  • abcde12345

これらはおそらく実際の辞書攻撃の標的となる可能性は低いですが、「aaaaa ...」の例と同様の問題に苦しんでいます。

現在、ほとんどの辞書攻撃でパスワードフレーズが標的にされているかどうかはわかりませんが、人気が高まるにつれて、それらがますます標的にされることは間違いありません。有名なxkcdの例では、これを考慮に入れていると思います。なぜなら、「共通ワード」ごとに11ビットしか割り当てられていないからです。アルゴリズムは、これらのタイプのパスワードも過大評価しています。

したがって、要約すると、アルゴリズムは推定のかなり良い仕事をしますが、実際にはパスワードの構造と一般的な既知のパターンを考慮する必要があります。


1つのレベルの派生チェックは、これらのパターンのすべてを識別します。
ワグ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.