パスワードの強度に関するさまざまなリソースを読んで、パスワードのエントロピーの大まかな推定値を提供するアルゴリズムを作成しようとしています。
できるだけ包括的なアルゴリズムを作成しようとしています。この時点では、擬似コードしかありませんが、アルゴリズムは次のことをカバーしています。
- パスワードの長さ
- 繰り返されるキャラクター
- パターン(論理)
- 異なる文字スペース(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<
、単語やパターンを含まないことです。