パスワードがヤバい。
ぼくは大抵の経済活動をWeb経由でやっていて、数百件のサイトと付き合いがある。
最初はすべてのサイトのパスワードを一緒にしていた。
アホ丸出しだが、そういう人はぼく以外にも多いという。
一般的なクラッカー(悪意のあるハッカーのこと)の手口は、どこかのサイトからログイン名(メールアドレスのことが多い)とパスワードの組み合わせを入手したら、それを使って世界にある何万というサイトを総当りに自動でアクセスし、アクセスできたサイトで買い物をしたり、さらなる個人情報を抜いたりする。
なにしろ、住所、氏名、生年月日が分かればサラ金でお金が借りられる場合もあるのだ。
また、古典的なディクショナリー・アタックも有力で、英単語とか、英単語の組み合わせとか、そういうぼうっとしたパスワードを使っている人もヤられてしまう。

Lock and Key
そういう話なので、サイトごとに固有の、せいぜい強力なパスワードを考えだしては端から覚えていたのだが、寄る年波で記憶力に限界が見えてきた。
サイトごとにある法則で頭の中で暗号化したパスワードにしていたこともあるが、このやり方もずいぶん脆弱である。
ということで、今更ながら、パスワード管理ツールのお世話になることにした。

パスワード管理ツールとはなんだろうか。
名前だけは知っていたのだが、イマイチ何をするのか分からなかった。
これは、少なくとも以下の3つのプログラムの機能を掛けあわせたものだ。

1つは、取引するサイトのログイン名とパスワードの組み合わせを覚えてくれる。
これで、どのサイトはどのログイン名でどのパスワード、という組み合わせを覚えたり、付箋紙に書いて会社のパソコンの液晶画面に貼ったり(そういう人いまだに多いよね)しなくても良くなる。

2つ目は、あるサイトにアクセスすると、そのURLやタイトルに応じて正しいログイン情報を自動入力してくれる。

上記2つの機能によって、パスワードをいくらでも難しく出来る。
V*^E(RVof^dzv9みたいな、これはぼくがキーボードを適当に叩いて得られた文字列だが、こういうパスワードも可能になる。
自分で覚える必要がないので、いくらでも難しくできるし、いざ使うときは自動で入力してくれるから、タイプミスもなくなる。

3つ目は、パスワードを登録するとき、ランダムな文字列で生成してくれる。
文字列の生成において人間の感情が関与する余地がなくなるので、強力なパスワードが出来る。

問題はログイン情報のリストをどこにどうやって置くか、ということと、そのリストにアクセスする人間が確実に自分であるということをどうやって保証かである。
つまり、パスワード管理ツールを使うことで、そのツール(システム)が脆弱性になる。
これは避けられないが、それを最小化するための工夫を各ツールは用意している。

ツールはいくつかあるが、1Password、KeePass、LastPassというところが有名である。

1PasswordはMac/iPhone由来のソフトだがWindowsでもAndroidでも使える。
しかし有料で、いかにも高価なので導入を控えた。
KeePassは無料のオープンソース・ソフトウェアだ。
早速使ってみたが、こちらはWindows中心でMac用は自動入力機能などがイマイチ使いづらい。
また、独立したソフトウェアで、ブラウザーで使うときはいちいちKeePassアプリを同時に起動しているのが鬱陶しい。

結局LastPassというのを使うことにした。
この会社は、XMarksという昔気に入って使っていたブックマーク同期サービスと同じ会社がやっていて、デザインが良くて使いやすい。
iPhoneなどと連携するプレミアムユーザーは有料だが、月1ドルということでまあまあお買い得かと思う。

LastPassには2つの大きな問題点がある。
まず、LastPassを使うためのログイン名とパスワードだけは、結局脳で覚えていないといけないということだ。
これはどのツールも共通で、せいぜい強力なものを使って、かつ絶対忘れないようにする。

もう1つは、ログイン情報のリストをLastPass社のクラウド(サーバー)に持っているということだ。

ここをヤられたらあらゆるサイトに入り放題になってしまうかというと、実はそんなことはなくて、LastPass社のサーバーには暗号化したパスワードしかない。
ここでいう暗号化というのは、Aさんがある情報を暗号にしてBさんに渡し、Bさんが元の情報に戻して読むというような、復号化できる暗号ではなく、一方向に暗号化するものだ。
これを行う仕組みをハッシュ関数という。

いま、ぼくがWebSiteXXXXというサイトに、query1000というログイン名と、pWXXXX9876?とかいうパスワードでログイン情報を登録したとする。
WebSiteXXXXという会社のサーバーには、query1000というログイン名と組み合わせたパスワードの情報として、pWXXXX9876?というナマの文字列(白文(はくぶん))ではなく、それをあるハッシュ関数によって長大な文字列(ハッシュ値)に変換したものが入っている。
ハッシュ値を入力にして、元のパスワードを復元することは出来ない。
(巨大なコンピューターをブン回してできることは出来るが、難しい。)
ではどうやってWebSiteXXXXはぼくのログインを可能にしているかというと、改めて入力されたパスワードからハッシュ値を再計算し、再計算した結果と保存されたハッシュ値が一致すればログイン成功、という仕組みを取っている。

だから、あるサイトがクラックされてログイン情報のファイルが漏出したからと言って、即危険というわけではない。
実際に危険があるのは、パスワードが短くありがちなものでハッシュをすぐに解読できたとか、複数のサイトから漏出したログイン情報のファイルにおいて同じログイン名のハッシュが一致した(パスワードを使いまわしていた)とか、ログインの瞬間に通信が暗号化されていなくて傍受されたとか、ハッシュ暗号を使わずに白文で保存しているいい加減なサイトがあったとか、そういう脅威があったときだ。
LastPassもWebSiteXXXXとは個別にパスワードを暗号化して、そのハッシュ値を保存している。
結果的にLastPassと本来使いたかったサイト(WebSite)ではパスワードを使いまわしている(同じログイン情報が2つのリストに存在する)ことにはなる。

※同じハッシュ関数を使ってもソルトやストレッチングなどの記法によって違うハッシュ値を生み出すことができる。
 次の記事が勉強になる。
 本当は怖いパスワードの話(1/4) - @IT

LastPassがサーバーにログイン情報を保持しているということは、LastPassの利便性と引き換えにユーザーが甘受しなければならない脆弱性である。

一方1PasswordとKeePassはログイン情報のリストをローカルのファイルに持たせられる。
1つのパソコンしか使わないのであればそれでいいが、2つ以上のパソコンやスマホで同一のログイン情報を使いまわすのであれば(大抵の人がそうであろう)何らかの仕組みが必要になる。
DropboxやiCloud、GoogleDriveのようなクラウド・スペースに置くやり方が流行っているが、それだと結局LastPass同様の脆弱性が発生する。
これらのクラウド・スペースは有名で、ユーザーが多く、露出度が高いのでネットワーク犯罪者にとっては破り甲斐がある蔵で、事実DropboxやiTunes Storeは何回か破られている。

どこの会社も信用しないとはから自分で管理する、と言った場合は結局自分を信用しなければならない。
ノートパソコンをどこかに置き忘れたり、ネットにつないだ自分のパソコンをクラックされない自信を持てるだろうか。
ぼくは到底持てない。
また、ツールを使わないで自分の頭で管理できるようなそこそこ記憶可能なパスワードを使えていた当時も、相当脆弱だったのである。
また、ネットワークサービスを使う以上そのサービス提供会社を信用しなければならない。
暗号化を使わず、白文でパスワードを収集して、そのログイン情報で他のサイトに攻撃するような、パスワード収集目的のサイトの開設も可能であろう。
そういうサイトから身を守るためには、やはりサイトごとに個別に、十分に長く強力なパスワードを管理する何らかの仕組みが必要になる。

必死でLastPassを選んだ自分の選択を弁明するような流れになってしまったが、実際のLastPassの使い方、その利点については、次回書こうと思う。
とりあえずFirefoxのような有名ブラウザーでいままで自動ログインをたくさんやってきたユーザーは非常に便利だ。
パスワードの移行、再設定、自動ログインが感動的にカンタンだからだ。
LastPassのサーバーも一度クラックされたことがあり(それを期に二段階認証を実装した)、必ずしも安全とは言い切れないが、現時点では気に入っている。