先日、このことについて考えていました。安全なパスワードの作成について読んだ後、いくつかのオプションがあります。
最初は、数字を追加するか、単なる単語以外のものです
Password15068またはPa55w0rd15068またはPassw0rd15068
しかし、私は一般的なコンセンサスは、ランダムな、L337音声が得られるほど、覚えるのが難しくなるということを信じています。
私が読んだ次の方法は、4〜5語を取り、それをフレーズまたは単一の語に結合することでした。たとえば、5語は「犬」「散歩」「中」「ザ」「庭」だとします。可能なパスワードは次のとおりです。
犬は庭やDowainthyaや他の乱雑なコンボを歩きます...
しかし、これは覚えにくいという同じ問題を引き起こします。考えさせられたのですが、今まで考えたことはないと思いますが、絵文字が1文字であると見なすのに十分な高度なクラッキングソフトウェアですか?またはそれはユニコードでそれを読みますか?別のことは、私がこの絵文字を使用すると言うことです:????これはこのコードxn--ss8h
を生成するので、パスワード「Password ????」 9文字/数字として読み取られますか?または17?
パスワード????またはPasswordxn--ss8h
それがユニコードとして読み取られるとしたら、クラッカーが推測しなければならない文字が余分に増えることになります。 (それがブルートフォース攻撃であると仮定します)。 BFクラッカーがパスワードPasswordxn--ss8h
を見つけた場合でも、パスワードスロットにパスワードを入力すると、一致する絵文字ではないためログインできませんか?
これは明らかに理論的な状況です。これを実際に容認したことはないと思いますが、将来的には、パスワードの代わりにhappyfacemoneybags
を使用できると間違いなく役立つと思います:????????
またはxn--ss8h7u
が正しいアイコンがスロットにある場合にのみ、システムはログインを許可します。
これは、パスワードチェッカーを介して可能なパスワードを実行することに関連しています。
制御パスワード:hellohello
hellohello
は、スコア%および"very weak"の複雑さを生成します。
注意すべき重要な点:
????hellohello
は42%のスコアと"good"の複雑さを生成します。
注意すべき重要な点:
????HelloHello
は80%のスコアと"very strong"の複雑さを生成します。
注意すべき重要な点:
????HeLLoHeLLo
は、スコア88%および"very strong"の複雑さを生成します。
注意すべき重要な点:
このパスワードに基づいて、記号????
を明確に追加することで少し安全になりますが、このパスワードチェッカーがどのアルゴリズムに基づいているかはわかりません。
[〜#〜]免責事項[〜#〜]:私は暗号の専門家ではありませんが、ここではこの種の攻撃を試みる方法を示します事の。
これは明らかに理論的な状況です。これを実際に容認したことはないと思いますが、将来的には、パスワードhappyfacemoneybagsの代わりに、次の場合に間違いなく役立つと思います。????????またはxn--ss8h7uですが、システムは、正しいアイコンがスロットにある場合にのみログインを許可します。
「正しいアイコンがスロットにある場合にのみログインを許可する」という意味を理解できません。
絵文字が小文字だけで出力されない限り、パスワードを長くすることによってのみ「助ける」ことができる可能性があります。理由は次のとおりです。
絵文字unicode reference
がxn--ss8h
にstring
として出力され、すべてlower case
である場合、X、N、S、またはH.これにより、パスワードを解読するために必要な時間を短縮できます。
2つの絵文字のパスワードについては、すぐに解読できない場合は、ほぼ瞬時にを解読します。
構造体テーブルを作成します。これがC++の準疑似コードです。
typedef struct EmojiDef {
string face;
string value;
} EmojiDef,*pEmojiDef;
static EmojiDef EmojiTab[]=
{
{"????", "xn--ss8h"} // etc... ???? would be the actual unicode value, whatever it is. xn--ss8h would be your formatting.
};
table
をループして、考えられるすべてのパスワードを生成します。
ご覧のとおり、特に2つの絵文字の場合、これにより実際にはさらに悪化する可能性があります。それらは構造テーブルで非常に簡単に表すことができます。いくつかの可能な文字をすべてlower case
にすることで削除するので、おそらくそれはより簡単になります。
この時点では、lower case
、upper case
、またはmixed case
のいずれかでユニコード参照を作成できるプログラミング言語があるかどうかはわかりませんが、例では、ブルートフォース攻撃を成功させるために必要な文字数を差し引いていると考えてください。それをもっとよく説明してみましょう:
xn-ss8h7u
をxN-sS8h7u
にすることはできませんか? XN-SS-8h7u
になれますか?絵文字のユニコードを参照するときに小文字しか使用できない場合、うんざりしています!
[〜#〜]更新[〜#〜]
私のパスワードが???? helloの場合、xnを使用して???? helloとしてのみアクセスできます--ss8hhelloを使用してもログインできません。それを考慮してみましょう
構造表を覚えていますか?これは、Unicode文字を文字列出力に変換するためだけのものでした。配列比較ループを使用して、文字の少ない絵文字をすばやくクラックします。
更新2
今、私はあなたの要点を見ています...しかし、このように各絵文字を紹介すると、テストに必要な文字の量が減る可能性があります。各絵文字は単一の文字列テストとして参照できますが、何千ものテストがあるため、実際にはパスワードの強度をかなり高めています絵文字の組み合わせを使用する場合は、大文字と小文字を組み合わせて、 etc。単純なパスワードの場合、これは依然として非常にクラックされる可能性があります。構造テーブルを配列/リストに変更し、すべての参照を挿入してから、ループして、弱いパスワードにアタッチしてみます。このような愚かな何か:
for (int i = 0; i < emoji; i++)
{
if (checkPassword(emoji[i] + dict[i]) { writeFound(emoji[i] + dict[i]); } // check either side, etc.
}
更新3
???? hellohelloは、42%のスコアと「良好」の複雑さを生成します。
???? HelloHelloは80%のスコアと "非常に強い"複雑さを生成します。
???? HelloHelloは80%のスコアと "非常に強い"複雑さを生成します。
???? HeLLoHeLLoは88%のスコアと「非常に強い」という複雑さを生成します。
絵文字のstring array
を(前または後のいずれかで)総当たりテーブルのbadpasswordと比較すると、スコアが生成されます:すべてのパスワードが1時間以内にクラックされます。これを試す:
...入力に対して、Unicode参照と不正なパスワード(前または後)を文字列連結することにより、非常に迅速に無効になります。
[〜#〜]結論[〜#〜]
はい、そう思いますが、パスワードの一般的なベストプラクティスと組み合わせて使用し、それらを複数使用する場合に限ります。その時点で、多くの人が代わりにパスワードマネージャーの使用を提案しています。
たぶん、もっと知識のある人が入り込むべきかもしれませんが、特に2つの絵文字のパスワードを使いたいのであれば、このシステムのいくつかの部分は一見信用できません。または、10、または20を続けて。これは基本的に、配列で表される数値のコレクションになり、小さい数値ベースのパスワードは最も安全でなく、簡単に解読できます。
パスワードを解読する難しさは、パスワードの生成に使用されるプロセスのエントロピーによって測定されます。これは、ほとんどのパスワードで、使用される記号の数で累乗された記号の数の2を底とする対数を取ることで測定できます。たとえば、8つの小文字で構成されるランダムに選択されたパスワードには、log2(26 ^ 8) ~ 38
ビットのエントロピーが含まれています。
この方法は、「正しい馬バッテリーの定番」スタイルのパスワードに拡張できます。この場合、各単語はそれ自体がシンボルであり、10,000の最も一般的な単語の辞書から選択されます。この方法でランダムに生成されたパスワードは、log2(10,000 ^ 4) ~ 53
ビットのエントロピーを持ち、解読が非常に困難になります。
うまくいけば、これらの2つの例を見ると、ベースを劇的に増やすと、指数を適度に増やすよりも、はるかにはるかに小さいパスワードエントロピーへの影響がわかります。選択する追加の記号(大文字、数字、記号、極端な場合は、絵文字、RTLマーカー、漢字などの非ラテンUnicodeコードポイント)を追加することで、ベースが増加し、指数ではありません。このwillは一般的にパスワードを解読しにくくし、覚えやすくなりますが、長さ(および指数)を増やすとさらに役立ちます。
たとえば、小文字(26)、大文字(26)、数字(10)、一般的な記号(32)、および一握りの絵文字(たとえば200など)を含めると、ランダムな8文字のパスワードはlog2(26 + 26 + 10 + 32 + 200) ^ 8) ~ 66
ビットのエントロピー。一方、小文字のみで構成されるパスワードの長さを2倍にすると、エントロピーがlog2((26 ^ 16) ~ 75
ビットのパスワードになり、解読するのが500倍以上難しくなります。
絵文字canを追加するとパスワードが強力になりますが、単に長さを長くするほど効果的ではありません。 _Password15068
_のような恐ろしいパスワードが、解読することが有意義に困難なものになることはありません。そして、実際のパスワード入力フィールドの多くでは機能しません(一部のフィールドは完全に拒否され、さらに悪いことに、黙ってその文字が無視されます)。さらに、????????のような2文字のパスワードnever安全です。選択できる絵文字はほんの一握りしかないという単純な理由からです。それらの1万個を想定しても、エントロピーはlog2(10,000 ^ 2) ~ 27
ビットのみのパスワードのままです。
あなたの最善の策は、単純にパスワードマネージャを使用するにすることです。人間は複雑なパスワードを記憶するのはひどいですが、コンピュータはそれが得意です。パスワードマネージャーは、アクセスするすべてのサイトに強力で一意のパスワードを提供し、最も弱いコンポーネントである人間を排除します。
更新:元の投稿ではこれを明確にしていませんでしたが、エントロピーの直線的な増加は、クラックの困難さの指数関数的な増加を表しています。エントロピーがn
ビットのパスワードを解読するには、平均して2^(n-1)
操作が必要であるため、エントロピーが1つ増えるたびに、パスワードを破るのに必要な労力は2倍になります。
複雑なパスワードの目的は、総当たり攻撃を防ぐことです。攻撃者の直接的な標的にされていない限り、攻撃者は簡単なパスワードとその順列を試し(「簡単」でも数万のパスワードをカバーします)、他の誰かに移動する可能性があります。これらの簡単なパスワードは通常、一般的な(パス)ワードの辞書に基づいており、考えられるすべての文字の組み合わせを試すだけではありません。現時点では、パスワードに絵文字を使用する人はほとんどいないので、それらを使用するとパスワードが一意になる可能性が高く、(リモートから安全な方法で保存されている限り)信じられないほど簡単に解読されます。攻撃者が辞書に絵文字を追加した場合でも、Unicodeには十分な絵文字があり、☺のように明白なものを選択しない限り、パスワードに入力する他のほとんどの文字よりも強力です。つまり、絵文字はパスワードをより安全にします。
ただし、絵文字を含めても、他のパスワードガイドラインに準拠できないということではありません。特に、サイトごとに異なるパスワードを使用することはできません。すべてのベストプラクティスに反して、ユーザーのパスワードをプレーンテキストまたはプレーンテキストに変換できる形式で保存するサイトがいくつかあります。どこでも同じパスワードを使用し、それらのサイトの1つでセキュリティ侵害が発生した場合、攻撃者は他のサイトにログインするだけでよいため、そのパスワードに絵文字を含めることの利点はまったくゼロになります。
別のことは、私がこの絵文字を使用すると言うことです:????これはこのコードに生成されます
xn--ss8h
パスワード「Password ????」 9文字/数字として読み取られますか?または17?
パスワードの対象となるサービスが奇妙なことをしていない限り、使用される攻撃に応じて9文字または13文字になります。 xn-ss8h
は、URLのようなもので使用できるようにするためのその文字の単なる表現ですが、実際には単なる数字です。 16進数では、その数は0xF09F92B0
なので、攻撃者があなたのパスワードを取得すると決定した場合、攻撃者はすべての文字(????を含む)を試すことによってブルートフォース攻撃するか、バイト単位で試行します(その場合は0xF0
、0x9F
、0x92
、0xB0
)。