複雑なパスワードを作ることを逆説的に考えてみた | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

昨今パスワードの流出やらクラックなんかのニュースで騒がれたりしていますが、複雑なパスワードをつけようというのは個人に依存する問題も一部あり、それがまた結構難しかったりもします。

例えば、誕生日をパスワードに入れ込んでみても、本人からしてみれば誰も自分の誕生日なんぞ知る由も無いだろうと思ってたりします。


ということで、複雑なパスワードの作り方ではなく、どうやったらパスワードをクラックできるかという視点で考えてみて、それらの考えを排除するやり方をとれば、複雑なパスワードの作り方というものも見えてくるかなと思い、考えてみました。

ここでは、パスワードファイルやDBから情報を引っこ抜いたり、通信の途中で傍受するというやり方ではなく、そもそもパスワードをどうやって推測するかというやり方で考えています。



パスワードを解析・推測するための法則



1. 英単語のみで解読してみる


パスワードを破る常套手段として、ディクショナリ攻撃があります。

英語辞書のデータを使って片っ端からそのパスワードを打ち込んでいくやり方です。

非効率なやり方ですが、解読のロジックはきわめて単純です。

辞書データなんかも、例えばLinuxの場合は「/usr/share/dict/words」を活用すれば簡単に引っ張れ出せます。

パスワードに利用できる文字数がサービスによって限定されている場合、それ以下の単語は対象外にできるのでなお推測しやすくなります。



2. 誕生日や電話番号、サービスの利用開始日などから推測


パスワードに数値を使うケースとして多いのは、このように覚えやすい数字を混ぜ込むケースではないでしょうか。

誕生日やサービスの利用開始日なんかは、情報が開示されているケースも多く、元ネタとして活用しやすい情報です。

電話番号なんかを知っている人は一部かもしれませんが、電話番号を知っている人全てが信頼できる人とも限りませんし、情報漏えいなんかした際にその情報からパスワードを推測されては意味がありません。



3. 名前(本名)やIDから解読してみる


パスワードに本名やIDを織り交ぜるケースも多いのではないでしょうか。

ネットで本名をさらすケースは少ないですが、IDなんかは丸見えです。

ただ、サービス側で本名やIDと同一のパスワードは禁止している場合が多いので、数字や記号との組み合わせで推測するケースがほとんどかと思います。



4. メールアドレスから解読してみる


メールアドレスには、その人を識別するための情報が満載です。

誕生日を付けていたり、IDと同じように自分を表現するための識別子が付けられたりします。

メールアドレスはブログに貼り付けてたりするケースも多いので、推測するためのネタとして使い易かったりもします。



5. 初期パスワードから解読してみる


サービスの利用開始時に、サービス側から初期のパスワードが発行されるケースがあります。

それをそのままブラウザに記憶させてしまう人もいたりするので、その初期パスワード自体を解読してしまうということもできます。


そして、システムが発行する初期パスワードは、ランダムなようでそこから規則性を見出すこともできます。

例えば、必ず6文字になっており、小文字の英字のみで構成されるというような感じです。

この場合、ある程度規則がわかっているので、むやみやたらにパスワードを生成してアタックするよりも効率的になります。

小文字の英字(26種類)のみで6桁のパスワードとなると約3億のパターンになりますが、小文字の英字と数値で6桁となると約21億パターンにも跳ね上がります。

初期パスワードでどういった構成になっているのかを把握するだけで、随分と解読のパターンを絞り込むこともできたりするわけです。


これだけでは、十分に初期のパスワードでも複雑かもしれませんが、サービスによってより具体的な初期パスワードの発行ロジックがわかれば、ぐっと効率化できるかもしれません。



6. 最初や最後の文字を大文字にしたり記号を入れて解読してみる


サービスによって、英語の大文字や記号を使うことがポリシーとして決められていたりするケースもあります。

こういった場合、どこの文字を大文字にしたか、記号を入れたか記憶があいまいになるので、とりあえず先頭や最後の文字を大文字にしようと考えたりもします。

ただ、これは英単語を使っているケースなど、そもそもパスワード自体が推測されやすいものではないと解読は難しいと思いますが。



7. 文字を代替して解読してみる


英字、記号、数字の中では形が似ているところから、特定の文字を別のものに代替して利用していることは無いでしょうか。

例えば、英字のo(オー)の代わりに数字の0を使ったり、英字のbの換わりに数字の6を使ったり、数字の1の変わりに記号の!を使ったり。

これも、元のパスワードがある程度推測できていないとダメですが、その上である程度よく使われる代替のパターンで解読してみることも考えられます。



8. 簡単なロジックから解読してみる


例えば、キーボードの配列を工夫していつものパスワードを全く別の文字列にしてしまうようなパターンです。

「itboy」という文字を、キーボードの配列のすぐ上の文字を利用して「85g96」という文字にして、それを利用するとか。

英語の並びで一つ前の文字を拾ってパスワードにしてしまうとか。(「itboy」であれば、「hsanx」とか)



9. サービス側で設定しているパスワードの設定規則から解読してみる


5.の初期パスワードに近いところではあるんですが、サービス側でパスワードに設定できる文字列や長さが予め決められていたりするケースがあります。

8文字以上12文字以内で、英数字のみとか。

これだけでは、十分に複雑なパスワードを作り上げることはできますが、今までの解読パターンを組み合わせれば的をある程度絞り込むことができたりもします。

1.のディクショナリ攻撃をする場合でも、その範囲にある単語を抽出して解析を試みたり、何もなしに解読しようとするよりは効率的になるでしょう。



10. 本人の趣味・思考から解読してみる


これは、その人のことを知っていないといけないパターンになりますが、その人自体の趣味や考え方からパスワードを推測することもできます。

よく口にするキーワード、好きな人物・食べ物などなど。


パスワードにそういった単語や数字を使うパターンが多いので、如何に親しい人であっても見られてはまずいものに設定するパスワードは、そういった考えを排除して設定した方が良いでしょう。

親しくなくても、プロフィール欄を見てその人の趣味がわかったりするケースもありますからね。



まとめ


サービスによりけりですが、パスワードは英字(大文字・小文字)、数字、記号の4種類で構成されます。

それを後はどれだけの長さで設定するかで複雑さも決まったりしますが、解読を試みようとする場合は、いかにそれを効率化できるか、って視点になったりします。


総当り攻撃(ブルートフォース・アタック)では、あまりに非効率ですし、時間がかかります。

その間に不正なアクセスとして排除されることもありますし、アカウント自体をロックされる可能性もあったりします。

また、人間が覚えることなのである規則性が必ずあったりもするわけです。

なので、その規則性をどうやって効率的に見破るかってことがポイントになってきます。


ここに挙げた例の全てが危険というわけではなく、組み合わせることによって複雑化することもできます。

ただ、推測されやすい規則性を除外し、オリジナルのパスワードを記憶しておくことが重要になると思います。

忘れっぽい記憶しておこうということではなく、パスワード自体はきちんと頭の中で管理しておく癖を付けることも、パスワードを見破られないためのコツになってくるのではと思います。