セカイノカタチ

世界のカタチを探求するブログ。関数型言語に興味があり、HaskellやScalaを勉強中。最近はカメラの話題も多め

なぜ「2つの単語を数字でつなぐ」と良いパスワードになるのか

qtamaki.hatenablog.com

良いパスワードってなに?

さて上記のエントリーですが、簡潔に強固なパスワードの設定方法だけを述べました。

パスワードについては、色々な点について考慮する必要があり、長くなりそうなので割愛したのですが、折角ですので、なぜ「2つの単語を数字でつなぐ」と良いパスワードになるのか、理由を書きたいと思います。

パスワードに取って良い特性というのは、下記のようなものだと思います。

  • 覚えやすく忘れにくいこと
  • 攻撃を防げるくらい十分に複雑であること
  • サイトごとに別のパスワードを設定すること

それぞれについて、説明したいと思います。

前提: 対象はウェブサービスのパスワード

その前に、前提としてウェブサービスのログインパスワードに話を絞っています。

一口にパスワードと言っても様々な用途に使われます。

用途に応じて適切なパスワードの設定方法は変わってきます。

ウインドウズやマックのログインパスワードや、zipパスワードなどは、それぞれ別の特性を持っていると思います。

覚えやすく忘れにくいこと

良いパスワードにとって最も重要な特性は、「覚えやすいこと」だと思います。

「紙に書いて付箋で貼っておく」という古典的になセキュリティホールを発生させないことが重要です。

「ランダムで英数記号入り混じった8桁以上のパスワード」というのは、パスワード単体では強固ですが、人間が運用するところまで考慮にいれると脆弱極まりないシロモノです。

短略的近視眼的措置です。最悪です。

同じ理由で、「一定期間でパスワードの変更を求める運用」も最悪です。絶対に覚えられません。

せいぜい連番で運用されるのが目に見えているので(プログラムでそれを対策しているセキュリティソフトも有りますが本末転倒甚だしい話です)、全く無意味どころかセキュリティホールを大きくしています。

そして、この条件に「2つの単語を数字でつなぐ」というルールは適合しています。

自分の好きな単語と好きな数字や記号を活用できるので、相当数のパスワードを無理なく記憶できます。

記憶術では、「箱となる単語」と「中身になる対象物」と連携させて記憶します。

これと同じ原理でパスワードを生成できるので、強固な上に記憶の妨げになりません。

攻撃を防げるくらい十分に複雑であること

パスワードは、どれぐらい複雑でなければならないのか。

それを知るために、防がなければいけない攻撃について説明します。

ブルートフォース

もっとも原始的で強力な攻撃方法は、ブルートフォースと言われる「総当り」方式です。

パスワードの組み合わせを数えるとおよそ下記のようになります。

文字種 PW桁数 およそ 必要日数
0 8 1億 0
a 8 2千億 0
a0 8 2兆 1
Aa 8 53兆 21
Aa0! 8 6京 2,559
a0 13 170垓 65,810,852
a0 12 4垓 1,828,079
a0 11 131京 50,780
a0 10 3京 1,411
a0 9 101兆 39
a0 8 2兆 1
0 15 1京 386
a 11 3京 1,416
a0 10 3京 1,411
Aa 9 2京 1,072
Aa0! 8 6京 2,559
a0! 9 35京 13,678
Aa0! 15 463穣? 178,738,900,524,596,000

※文字種... 0:数字, a:小文字, A:大文字, !:記号

この表は、2008年ぐらいに作ったのですが、当時のコンピュータの処理性能で270万件/秒の処理性能でした。このため余裕を持って3000万件/秒の処理速度でブルートフォース攻撃を仕掛けられた場合に耐えられる日数を計算しました。

これによると、英小文字のみのパスワードでも11文字あれば、約4年耐えるので十分ではないかと思います。

細かいことを言うと、文字種で言うと、記号が33種類で大文字小文字が26種類、数字が10種類なので、英数を織り交ぜるなら記号を含んだほうが有利です。

と、ここまで言っといてなんですが、こちらの数字はあくまでローカルマシン上で総当たり攻撃を行う場合の強度なので、インターネット経由でウェブサービスを総当たり攻撃する場合だと遥かに試行回数が減りますので、8桁の英小文字のみのパスワードでもほぼ突破されません。

ディクショナリ

インターネット経由での無差別攻撃だと、総当たり攻撃よりもこちらがメインになります。

ディクショナリアタックは、「パスワードに設定されていそうな文字列」を辞書化して順番に試していく、これも原始的で強力なアタックです。

たとえば「password」とか「12345678」とかいうパスワードは速攻で餌食になるわけです。

わかりやすそうな大文字小文字の組み合わせなんかも辞書攻撃でやられます。「Passw0rd」とかです。

良い解決

これらの攻撃をかわすためにパスワードは「適度な長さがあり」「攻撃者の辞書に載っていない」必要があります。

この条件に「2つの単語を数字でつなぐ」というルールは適合しています。

「簡単な単語だったら辞書に載ってるんじゃないの?」

という疑問があるかと思いますが、「それらの組み合わせ」というのは無限通りありますので、個別の辞書では対応できません。

勿論「catdog」のような簡単な単語の連続であれば、辞書に入っている可能性があります。

しかしそれも「数字でつなぐ」を加える事で、ほぼ辞書では対応できなくなります。

「cat191dog」というパスワードが攻撃者の辞書に載っているのであれば、「cat190dog」や「cat192dog」も載っている必要があり、そうすると組み合わせの数が膨大になるため試行回数の問題で攻撃不能になります*1

そして、「cat191dog」を総当りする場合、上の表では101兆通りあり、39日かかります。

これは恐らくローカルでブルートフォースを食らった場合でも生き残れる可能性が高いと思われます。

サイトごとに別のパスワードを設定すること

サイトごとに別のパスワードを設定する必要があるというのは、下記の理由からです。

  • フィッシングサイト対策
  • セキュリティの甘いサイト対策

まず、第一のフィッシングサイトですが、本物のサイトっぽい適当なサイトをでっち上げ、そこに入力されたパスワードを別のサイトへの攻撃に使用するという手口の攻撃です。

第二のセキュリティの甘いサイトですが、未だに「パスワードをわすれた方へ」でパスワードが平文でメールされてくるサイトがあります。

こういうサイトからデータが流出したり、クラッキングにあったりするとパスワードが平文で流出します。

上記の2つは、別のサイトへのパスワードを同じにしていた場合に攻撃が成立しますので、サイトごとにパスワードを変えることで被害の拡大を防ぐことができます。

また、それ以外のサイトであっても、パスワードが流出する可能性は常にあります。

普通のサイトであればパスワードはハッシュ化という技術を使い、不可逆に変換されており、平文のパスワードを取り出すことはできません。

この場合でも、総当たり攻撃でパスワードを解析することは可能です。

手当たり次第にパスワードをハッシュ化してみて、同じハッシュ値が出てくるパスワードを調べるという方法です。

十分な長さと複雑さを持ったパスワードでない場合、パスワードが解析されてしまう可能性があります。

そのため、インターネット上のウェブサービスのパスワードであっても念のため、11文字以上の英数混在パスワードが望ましいのです。

そして、この条件にも「2つの単語を数字でつなぐ」というルールは適合させやすいです。

「dragon11quest」で13文字です。

簡単に長めのパスワードを生成することができます。

まとめると

「2つの単語を数字でつなぐ」形式のパスワードは、十分に長く複雑で覚えやすいのでおすすめです。

この特性は特にインターネット上のサービスに対してのログインパスワードに使うのにもってこいです。

一応念のため、記号を混ぜるなどのアクセントを忘れないようにしてください。

パスワードの煩わしさが軽減して、あなたのインターネットライフが充実したものになりますように。

補足: ソーシャルアタックは多分防げない

コンピュータへのアタックで、一番強力なのはソーシャルアタックです。

ソーシャルと言ってもソーシャルネットワークサービス(SNS)とは直接は関係ありません。

対象者を限定もしくは特定して、社会的にあらゆる手段を講じて攻撃する方法です。

例えば僕が「2つの単語を数字でつなぐ」というルールでパスワードを生成することを特定して、ディクショナリアタックをされた場合、想定よりもかなり強度が下がります。

また、本人が強固なパスワードを設定していても「同僚」や「上司」「家族」などのアカウントをハッキングして情報を盗み出すという手段も考えられます。

究極的には、米露などの政府機関であれば、暗号通信のマスターキーを持っていてパスワードをネットワーク越しに送信した途端に傍受して解析してしまうかもしれません*2

これは極端な例ですが、アタナが政府の要人であるとか巨大企業の意思決定に携わる職業であるとか、軍事的な機密を扱う場合、通常の「一般的な」セキュリティ対策では不足するかもしれないということです。

セキュリティは、元々軍事的な用語でもありますし、保護したいものと想定される攻撃者、攻撃方法によって柔軟に対応を変える必要があると思います。

*1:辞書攻撃の前提では「膨大な量のユーザーに対して簡単な単語で次々攻撃する」必要があります。簡単な単語をパスワードに設定している人を炙り出す攻撃なので、少しでも複雑なパスワードならば諦めて次のターゲットに移ります。そのほうが「効率的」だからです

*2:そんなまどろっこしいことをしなくても実行部隊を2,3送り込んであたなを「無力化」することも可能ですね:-p