2016年6月18日土曜日

パスワードマネージャは本当に安全か

Web上で提供されるサービスが増えるに従い、パスワードを入力する機会も増えてきました。それもITギークに限らず、スマホを持っている一般人すべてに関してです。そこで次のような「助言」がよく聞かれるようになってきました。

「パスワードを使いまわしてはいけない」
「パスワードには大文字、小文字、数字、記号などを混ぜたほうが良い」
「パスワードは定期的に変えたほうが良い」
「パスワードは紙などにメモしてはいけない」
「パスワードマネージャを使えば複数のパスワードを覚える労力から開放される」
「100%安全な管理方法はないので、クラウドによる管理が心配でも妥協するしかない」

でも本当にそうでしょうか?真剣に考えてみたらこれらに同意できるでしょうか?というのが今日のお題です。




まず基本的な概念からおさらいしておきましょう。
パスワードの強固さとはなんでしょうか?予測されにくさ?ありがたいことにこの曖昧な概念には定量的な単位があります。それは情報量エントロピーというもので、単位はビットです。

「情報量エントロピー」という専門的な響きに「ウエッ」となる人もいるかもしれませんが、そう難しい概念ではありません。

たとえばあなたのことを良く知っている人が、あなたの使いそうなパスワードは2つだけだということを知っていてクラッキングを試みるとすると、あなたのパスワードのエントロピーは1bitです。たとえどんなに長くてもです。
それでは弱すぎるので、2つのパスワードをランダムに2回選んで連結したものをパスワードとしたとすると、エントロピーは2bitになります。

一般に、情報量エントロピーは、推測する側が持っている事前情報に依存します。たとえばアルファベットの小文字だけを使っているということが事前にわかっていれば、選べる文字は26種類だけですから、エントロピーは文字あたり約4.7bitです。大文字も混ぜることにすると約5.7bitになります。計算するには、選択肢の数の2底の対数をとればよいです。

$$W = \log_2(x)$$

この数字を使えば、パスワードの強固さを比較することができますし、どのくらい推測すればクラックできるかも計算できます。 たとえばアルファベット大文字・小文字と数字をランダムに5文字組み合わせて作ったパスワード(h2Zl9のような)のエントロピーは約29.8bitで、1秒に1000回試行できる環境があれば10日でクラックできてしまいます。

あなたのパスワードのエントロピーは、下記ページで確認できます。
http://rumkin.com/tools/password/passchk.php
(注意!リンク先のページの作者は、入力したデータはブラウザ上だけで処理され、他には送られないと主張していますが、私はリンク先ページの安全性を保証するものではありません。実際に使っているパスワードではなく、似たような文字や長さのパスワードで試すことをお勧めします。)



さて、さらに基本に立ち返って、パスワードがクラッキングされるのはどういう場合かを考えてみましょう。昔はログインパスワードを何度も推測して入力するというのが主に想定された手口でしたが、今は違います。メールアドレスやパスワードのリストがセキュリティの弱いサイトでクラックされると、他のサービスでもそのリストが試されるというのが最もありうるケースになりました。最近ではGitHubやLastPassでさえもクラックされており、サービスの種類の増加に伴って日常茶飯事と化しています。

最悪の事態は、すべてのサービスに同じパスワードを使いまわしており、そのうち一つがクラックされてすべてのサービスに侵入されるというケースです。

 そこで、「助言」の根拠を見てみましょう。

「パスワードを使いまわしてはいけない」 


というのは、このようなリスト攻撃に対する直接的な防御になります。正しい助言のように思えますが、それはサービスごとに別々のパスワードを覚えていられればの話です。現実問題として、10以上のサービスのパスワードを別々に覚えていられる人はいないでしょう(いるかもしれませんが、今の問題は平均的なサービス利用者の記憶力です)が、10以上のサービスを使っている人など珍しくもありません。
むしろ、覚えやすいように簡単なパスワードにしてしまうかもしれないので、 セキュリティが低下する可能性すらあります。

 実際には、平文のパスワードそのものをサーバに保存しているサービスは、いくらセキュリティが弱いところであっても(滅多に)ないはずです。少なくとも一方向ハッシュ関数を適用して、元のパスワードがわからないようにしているはずです。(私の会社の前任者はお客さんのパスワードを平文でデータベースに保存するシステムを設計していましたが、世に出る前に修正しました)

一方向ハッシュ関数とは、平たく言うと「もとのパスワードはわからないが、あなたが入力したパスワードがもとのパスワードと一致していることはわかる」ということです。すなわちハッシュデータを盗まれても、そのままでは他のサービスの同じパスワードをクラックすることはできないということです。

 しかし、ハッシュが盗まれると「総当り攻撃」(brute-force attack) が可能になってしまいます。通常のログイン画面では一定回数ログインに失敗するとロックされたり、試行の頻度を下げたりして(1分に1回など)、総当り攻撃に対する対策が取れますが、盗まれたハッシュへのクラックは攻撃者の手元の計算能力でいくらでも加速可能です。このことを考えると、60bit程度のパスワードであれば、1秒に10万回試行できる計算機でもクラックに3600年ぐらいかかるので、割と安全といえるかもしれません。もちろん計算能力の進化によってはすぐに安全でなくなるかもしれませんが。

「パスワードには大文字、小文字、数字、記号などを混ぜたほうが良い」


前述のようにアルファベット小文字のみのエントロピーが約4.7bitなのに対して、大文字も混ぜることにしても5.7bitにしかなりません。さらに30種の記号を含めることにしても6.5bitです。しかもこれは各文字を完全にランダムに選んだ場合の話です。先頭の文字だけを大文字にするのでは、ほとんどエントロピーは増加しません。

このように完全にランダムに選んだ大文字、小文字、数字、記号が混ざった文字列を覚えるのがいかに難しいか、説明するまでもないでしょう。それよりも、小文字だけで文字列の長さを2倍にしたほうがよっぽど効果があります。

ここでもやはり、覚えられるような組み合わせを考えてしまいがちになるので、むしろ弱くなる可能性が十分にあります。

このようなガイドライン(場合によってはルール)がはびこった理由としては、パスワードに文字数制限があった時代の伝統が考えられます。上限8文字などの制限でエントロピーを増大させるには大文字、小文字、数字、記号を混ぜるのは確かに効果的です。

しかし、パスワードの強固さは、ありうる選択肢の数で決まるのであって、覚えにくさで決まるのではありません。 このことは忘れないようにしましょう。

このため、OpenPGPなどの暗号化ソフトウェアでは、英単語を並べたパスフレーズというのをパスワードの替わりに使っています。英単語はそれぞれランダムに選ぶ必要があり、文章にしてはいけませんが、数字や記号を覚えるよりは楽にエントロピーを増やせるというわけです。パスフレーズの作り方については、Dicewareが役に立ちます。

このトピックについては有名な漫画があります。


これについて詳しい説明はこちら。
https://www.explainxkcd.com/wiki/index.php/936:_Password_Strength


「パスワードは定期的に変えたほうが良い」


個人的にはこれをルール化されるのが最も気に障ります。

パスワードの変更が効果を発揮するのは、パスワードがすでにクラックされているが、本人はそのことに気づいていない場合だけです。「攻撃者がひとつひとつ候補を試している間に変更すれば、攻撃者は振り出しに戻るから、効果があるかもしれない」と思うかもしれませんが、前述のようにログイン画面に対して総当り攻撃というのは今時ロックされるので不可能に近く、リスト攻撃の被害にあう確率のほうが断然高いのです。セキュリティの弱いサイトからクラックされたハッシュは、攻撃者のオフラインで総当りされるので、のんびり数ヶ月に1度パスワードを変更するだけでは大した気休めにはなりません。

さらに、今まで述べてきた弱点がここでも当てはまります。定期的に新たなパスワードを考えなくてはいけないとなると、人は覚えやすい簡単なパスワードを使うようになってしまいます。

それよりも、2つのパスワードを別々の期間に使うなら、なぜ2つを連結したひとつのパスワードをずっと使わないのかと聞きたいです。そのほうがエントロピーは増えるし、切り替え時に新たなパスワードを覚える負担もないのに。40bitのパスワードをクラックするのに1.2日かかるとすると、80bitのクラックには38億年かかるのですよ。

クラックされているのに気づいていない場合だけは、この対策は意味がありますが、しばらくの間パスワードが流出したままの期間があったということは、いろいろな意味で手遅れでしょう。

「パスワードは紙などにメモしてはいけない」


これもきわめて古くからある助言です。明らかに正しいように思いますが、 ちょっと考えてみると、今やクラックの主流は職場の盗み見や個人の誕生日からの推測などではなく、リストを使ったマス攻撃なわけです。そこで重要なのはパスワードのエントロピーをいかに増やすかであって、肩越しに覗き込む同僚を警戒することではありません(よほど悪意に満ちた職場でない限り)。「紙にメモできないから、暗記できる程度の簡単な短いパスワードにしよう」ということになるのに比べれば、メモするのがことさら悪いこととはいえません。

ただ、 モニタに付箋を張ってわざわざ誘惑するようなことはしなくてもよいでしょう。肌身離さず持っている手帳の一ページに書いておくぐらいなら合理的ではないでしょうか。

ただし、ネットバンキングやキャッシュカードの番号は、やはりメモをお勧めすることはできません。手帳は落とすこともありますから。金銭に関するクリティカルなパスワードだけは頑張って覚えましょう。

「パスワードマネージャを使えば複数のパスワードを覚える労力から開放される」


 LastPassやDashlaneやKeePassなどのパスワードマネージャは、複数のサイトのパスワードを別々に覚えてくれて、複雑なパスワードを自動生成する機能もあって、定期的に自動変更もしてくれて、さらにデバイス間での同期もでき、上記の問題をすべて解決してくれる。救世主だ!といいたいところですが、どうにも納得がいきません。

やはり、マスターパスワードひとつクラックされるだけですべてがアウトというのは危険性を集中させている気がしてなりません。おりしもLastPassのサーバがクラックされたところで、LastPass側は顧客情報が漏れるようなデータは盗まれていないと主張しています(*脚注)が、ポイントはそこではありません。パスワードマネージャはやはり狙われるということです。

そりゃそうです。個別のサイトをハッキングするより、パスワードの宝の山を狙ったほうがリターンが期待できるのは明らかです。 私が攻撃者だったらそうします。

はやりのクラウドでの同期を使わず、ローカルマシンだけで使っていれば、サーバ側のクラッキングのリスクは減りますが今度はローカルPCが壊れるとすべてがおじゃんという別のリスクが生じます。

KeePassはパスワードデータベースを自分の好きなメディアにバックアップできるようですので、サーバを信用せずローカルPCのクラッシュにも備えることができるでしょうが、管理の煩雑さは残ります。


「100%安全な管理方法はないので、クラウドによる管理が心配でも妥協するしかない」

これはパスワードマネージャの使用を正当化するときに聞かれる言葉です。クラウドに大切なデータを置くことに拒絶反応を示す人に対して、「パスワードを使いまわすよりはまし」として説得材料に使われます。

100%安全な方法というのは確かにありません。しかしこの言葉は確率という概念に誤った印象をもたせるものではないかと思います。

何度か例示していますが、パスワードの長さとクラッキングの困難さは比例関係にはありません。
40bitのクラッキングに12.7日かかる場合、60bitには約3万6000年、80bitには383億年かかります。組み合わせの数は指数的に増大していきますので、長いパスワードを選ぶことは本質的に効果があるのです。

基本的に宇宙の年齢(137億年)よりもクラッキングに時間がかかる場合は、事実上不可能とみなして差し支えありません。多少計算能力が進歩しても、量子コンピュータが攻撃者の手に簡単に入るようにならない限りは、コストに見合うようにはならないでしょう。

これに対し、パスワードマネージャのシステム上の脆弱性を突かれる確率は、簡単に計算することはできませんが、宇宙の年齢のうちの1度よりもはるかに高いことは明らかです。


 じゃあ、どうすればいいのか?


どうも、すべてを解決する魔法のソリューションというのはないようです。時代の変化に伴い、パスワードの弱点は微妙に変化してきていると感じます。しかし最大の弱点は、みんなが必要としているのに、強固なパスワードを思いつくのは個人に任されているということではないでしょうか。

署名や印鑑、顔写真といった本人確認手段は、誰がやっても安全度は大して変わりませんが、パスワードは、決める人によって安全度のばらつきが大きすぎます。Dicewareはそれを標準化しようとしています。

今回は触れませんでしたが2段階認証というのも一般的になってきました。しかし国をまたぐと電話やSMSも通じるとは限らないので、やはり利便性には難がありますね。

まずは自分のパスワードのエントロピーを計測してみることが出発点になるのではないでしょうか。案外、感覚というのは頼りにならないもので、客観的に計測すると見えてくるものがあるものです。


個人的な所感としては、パスワードという情報量の少ない認証機構にはいずれ限界が来るという気がしてなりません。頑張っても記憶でなんとかなるのは数十ビットがせいぜいです。

希望としては生体認証のデバイスが安価で一般的にならないかと思っています。PCでもスマホでも良いですが、クライアント側でどこでも読み取れて(iPhoneだけってんじゃだめですよ)、サーバ側の生体情報との整合性をチェックできるようになれば、パスワードなんて覚える必要はなくなります。しかも情報量もパスワードとは比較になりませんから、クラッキングも難しくなります。

指紋認証はあまり安全ではないようですから、静脈系が良いと思いますが、パスワードを置き換えるために必要なのは、読み取りデバイスがどこでも手に入ることです。たとえば指紋認証デバイスを組み込んだ製品はいろいろありますが、いまいち広まりません。値段が高いなどの理由で普及しないと、パスワードを駆逐することはできません。全員が使えることが重要なのです。

そんなデバイスを作ることができるんでしょうか。私は、できる、と考えています。なぜパスワードが一般的なのかといったら、キーボードが一般的だからです。なら、キーボードと同程度に生体認証デバイスを普及させればよいだけの話です。


最後に


当然のことですが、上に述べたことは個人の考察であり、ここに書いてあることに従ったからと言ってクラックされないという保証はありません。

願わくば、こんな逃げ口上を書かなくてもよいようなテクノロジーの普及した社会になってもらいたいものです。




(*脚注) メールアドレスとパスワードのハッシュも漏洩したということなので、それで問題がないということは、よほど計算コストの高いハッシュ関数を使っているということでしょう。しかしここでも問題になるのはパスワードそのもののエントロピーです。ハッシュの計算にいくら時間がかかっても、すぐに予測できるようなパスワードをユーザーが選んでしまっていたらクラックは簡単です。結局、どんなにシステムを堅牢に作っても、ユーザーにパスワードの決定を任せているところが最大の弱点なのです。

0 件のコメント:

コメントを投稿