エントロピーにはさまざまな「種類」があるようです。私は2つの異なる概念に出くわしました。
A)correcthorsebatterystaple
のXKCDの例。 2048ワードのリストからランダムに選択された4つのワードが4 * log2(2048)= 44ビットのエントロピーであるため、44ビットのエントロピーがあります。これは理解しました。
B)実際の文字列のシャノンエントロピー、つまりエントロピーは、文字/記号の頻度に基づいて計算されます。シャノンの公式をcorrecthorsebatterystaple
に適用すると、1文字あたりのエントロピーは3.36ビットになります。
# from http://stackoverflow.com/a/2979208
import math
def entropy(string):
"Calculates the Shannon entropy of a string"
# get probability of chars in string
prob = [ float(string.count(c)) / len(string) for c in dict.fromkeys(list(string)) ]
# calculate the entropy
entropy = - sum([ p * math.log(p) / math.log(2.0) for p in prob ])
return entropy
print entropy('correcthorsebatterystaple')
# => 3.36385618977
ウィキペディアは私の混乱を増すだけです:
可能な結果セットのエントロピーと特定の結果のエントロピーの違いを理解することが重要です。公正なコインの1回のトスは1ビットのエントロピーを持っていますが、特定の結果(「ヘッド」など)は完全に「予測可能」であるため、エントロピーはゼロです。
- Wikipedia:エントロピー(情報理論)
トスのエントロピー(生成)と結果のエントロピー(文字列)の違いがよくわかりません。
correctcorrectcorrectcorrect
が得られます。 Aを使用しても、まだ44ビットです。 Bを使用すると、エントロピーはcorrect
と同じになります。 2つの違いはいつ重要ですか?ウィキペディアの記事では、数学的なエントロピーについて説明しています。これは、人々がパスワードエントロピーについて語ったときの意味とは異なります。パスワードエントロピーとは、エントロピーの数学的概念とは異なる特定の仮定の下でパスワードを推測することがいかに難しいかということです。
AとBはパスワードエントロピーの異なる概念ではなく、パスワードの構築方法として異なる前提を使用しているだけです。
はcorrecthorsebatterystaple
を英語の単語の文字列として扱い、単語は2048語のコレクションからランダムに選択されると想定します。これらの仮定に基づいて、各ワードはcorrecthorsebatterystaple
に対して正確に11ビットのエントロピーと44ビットのエントロピーを提供します。
Bはcorrecthorsebatterystaple
を文字列として扱い、任意の文字が現れる確率は英語の場合と同じであると想定します。これらの仮定に基づいて、correcthorsebatterystaple
には84ビットのエントロピーがあります。
したがって、どの定義を使用するかは、パスワードについてどのような仮定をするかによって異なります。パスワードがXKCDスタイルのパスワードである(そして各Wordに実際に2048分の1がパスワードに表示される可能性がある)と想定する場合、Aはエントロピーを計算する正しい方法です。パスワードが単語の集まりとして構築されているとは思わないが、文字が表示される確率が英語で表示される確率と同じであると想定する場合は、Bがエントロピーを計算する正しい方法です。
現実の世界では、これらの仮定はどれも正しくありません。したがって、「文字列に20ビットのエントロピーが必要であることを指定する要件」があり、これがユーザー生成パスワードの場合、エントロピーを正確に定義することは非常に困難です。詳細については、 パスワードエントロピーの計算? を参照してください。
一方、コンピューターで生成された文字列を使用できる場合(そして適切なPRNGを使用している場合)、各英数字(a-z、A-Z、0-9)はほぼ6ビットのエントロピーを提供します。
コイントスエントロピーは、あるトスから次のトスまで、前のトスの結果が次のトスの結果に影響しないことを前提としています。したがって、各トスは1ビットのエントロピーを追加します。
Shannonエントロピーは、次の文字の値isが前の文字の値によって実際に部分的に決定されていると仮定します(そしておそらくその他)。 「h」は「t」の後に続くことが多く、「e」は「h」の後に続くことが多いため、一般的なパターンには低いエントロピー値が割り当てられます。したがって、英語の辞書の場合、文字列the
は、文字列exu
よりもシャノンエントロピー値がはるかに低くなります。
パスワードに関してこれが直接意味することは、ごくわずかです。パスワードに関する本当の(そして唯一の)重要な質問は次のとおりです。
パスワードはどの辞書にありますか?
つまり、ブルートフォース攻撃を行うために潜在的なパスワードのリストを作成する場合、パスワードを含めるために辞書はどのくらいの大きさでなければなりませんか。
上記はすべて、頻繁に使用される実際のパスワードクラッキング辞書の例です。
パスワードの複雑さの目的は、総当たり攻撃に対抗することです。パスワードを含む使用可能な最小の辞書のサイズによって、パスワードを解読するために必要な時間が決まります。 攻撃者が使用できる辞書は推測できますが、確実にはわかりません。そのため、辞書サイズのプロキシとして、代わりにentropy。実際の攻撃メカニズムを反映していないため、これは代用としては不十分ですが、何もないよりは潜在的に優れています。
エントロピー計算に基づくパスワードの比較は、実りある可能性があるかもしれませんが、最終的には、パスワードがどれだけうまく耐えるかに間接的にのみ関連する数値に、あまりにも多くの値を割り当てないように注意する必要があります。
それを説明する最も簡単な方法は、例を使用することです。
乱数ジェネレータに証明可能出力エントロピーが出力の1桁あたり3ビットであるとしましょう。そのジェネレーターの「トス」エントロピーは3ビットです。ここで、20桁で実行するとします。途方もなく小さい確率にもかかわらず、ストリーム内のすべての数値は6として出力されます。 "toss"エントロピーは依然として1桁あたり3ビットなので、60ビットです。パスワードの実際の「結果」エントロピーはごくわずかです-3ビットまたは4ビット程度の低さであると主張できます。
違いは、 "toss"エントロピーは、ジェネレーターの確率論的モデリングに基づいて、出力の予測エントロピーを表し、 "result"エントロピーは、実際のケースで生成したデータの実際の情報エントロピーを表すことです。
1バイトには最大8ビットのエントロピーを含めることができます。これが上限です。データについてさらに学習すると、それらの8バイトブロックのエントロピーの量は減少します。ああ、すべてのバイトはすべてASCII文字ですか?つまり、最上位ビットは0である必要があります。エントロピーは7ビットまでです。制御文字はありません?ASCIIセット、0〜31は制御文字-タブ、エンター、ベル、ファイルの終わりです。これにより、文字がさらに削減されます。アルファベット、小文字のみ?使用可能なオプションが大幅に削減されます。英語の単語?それらの多くはありません-ランダムに選択された英語の単語全体は、単語が5文字である場合でも、たとえば約12ビットしかない場合があります。
人間が選択したパスワードはさらに悪いものです。可能性が小さいからではなく、いくつかは他よりも頻繁に選択されるからです。特定のパスワードが一般的である場合、簡単に推測できます。エントロピーに影響します。ユーザーの10%が「パスワード」を持っている場合、パスワードのリストのエントロピーが減少します。つまり、推測しやすくなります。
したがって、パスワードに関する情報が多いほど、エントロピーの計算が低くなります。シャノンの公式の場合、自然言語のバイアスを想定し、3.6ビット* 25文字=約90ビットでエントロピーを計算します。追加情報(4ワード、それぞれ2048のリストから)を取得すると、44ビットに低下します。
このように見てください-誰かがこのパスワードをハッキングしていて、それが何らかの自然言語であることを知っていて、突然それが2048のリストから4ワードであることがわかった場合(そしてリストを知っている場合)、彼らは突然自分の仕事を見つけますとても簡単です。
ここで見逃しているのは、エントロピー測定が関連付けられているという事実です特定の確率分布に。 パスワードからランダムに引き出される確率分布はどの確率分布かについて、何らかの明示的または暗黙的な仮定なしに、パスワードのエントロピーについて語ることはできません。これは、パスワードが生成されるプロセスの性質を示しています。
XKCDコミックで、マンローは、約2 ^ 11語の辞書からランダムに4つの単語を連続して個別に選択してパスフレーズを生成したと言っています。これは、パスワードが抽出されている確率分布、つまり、2 ^ 44の異なるパスフレーズのセットに対する離散的な均一分布を正確に示します。
しかし、これを行うと:
B)実際の文字列のシャノンエントロピー、つまりエントロピーは、文字/記号の頻度に基づいて計算されます。シャノンの公式を
correcthorsebatterystaple
に適用すると、1文字あたりのエントロピーは3.36ビットになります。
... Munroeが使用したものとは異なる確率分布を選択しているため、約84ビットのエントロピーを文字列(25×3.36)に割り当てる別の推定値を取得します。
生成方法がわからないパスワードのエントロピーを評価する場合、実りある直観的な見方の1つは、実際の確率分布が攻撃者の知識であり、ユーザーがパスワードを選択する方法に関する仮説であるという考えを採用することです。この配布がどのように見えるかについて合理的な考えを自分で形成できる場合、パスワードのエントロピーは、その配布に最適なコードでのメッセージ長です。これは、大まかに言えば、 zxcvbn のような優れたパスワード強度メーターでのアプローチです(ただし、パスワードをヒットする推測の平均数で計算します)。
この観点から質問に示した44ビットと84ビットの見積もりを見ると、これは次のようになっています。マンローは、攻撃者が100%正確であると想定しているため、パスワードのエントロピー見積もりがはるかに低くなっています。パスフレーズがどのように生成されたかについての仮説。これにより、膨大な数の文字列を除外できますアプリオリこれは、辞書内の4つの単語の連結ではありません。これに対して、説明するシャノンエントロピー計算は、XKCDスタイルのパスフレーズを推測する戦略の「スマート」ではないため、はるかに高いエントロピー推定を取得します。ただし、zxcvbnは賢く、パスワードクラッカーがcorrecthorsebatterystaple
を約10 ^ 14.43696推測でクラックして、約(14.4×3.3)+ 1≈48.6ビットのエントロピーと推定します。 (計算は、底が10から底が2の対数変換と、推測数からエントロピーに変換するための1ビットです。)これは、マンローの推定より少し多いですが、zxcvbnは、XCKDスタイルのパスフレーズ以外のパスワードを攻撃するようにコーディングされています。