はじめに
アットウィキの漏えい事件、ひどい噂ばかり聞こえてきますね。
実際にコード見てないので本当かどうかはわかりませんが、パスワードをsaltなしmd5で暗号化してたなんて噂もあって、あきれ返っています。
(うわさですよね? 業務で使うシステムでsaltなしはさすがに半信半疑です。もしそうなら、開発者の頭の中身を疑います)
ちなみにこれがどういうことかを説明すると、-
salt無しだと、カンニングシート(みたいなもの)があるからパスワード文字列がそのまま流出したのと同じだよ! saltなしmd5でもって「暗号化してあります(キリッ」とか言い出したら、指さして笑われるよ!
-
(2014/03/15追記: どうやら元は2chソースのようで続報がないので、噂だったのでしょう。しかし、危険であることには変わりないので、パスワード要廃棄を強くおすすめします)
ですから、アットウィキに登録していたパスワードは必ず廃棄してください。 同じパスワードを他のサービスでも使いまわしている(ダメな)人は、必ず変更しておくこと。
そして、
「メールアカウントのパスワード(たとえばgmailのパスワードとか)とアットウィキのパスワード同じにしてたわ」
なんて(ダメすぎる)人は、急げ、間に合わなくなっても知らんぞー! メールアカウント乗っ取られるとシャレになりませんよ。
パスワードをすぐに変更してください。できるならば、メールアドレスごと捨ててしまうのが最善ですね。
本題
さて前置きはともかくとして、パスワードって管理するのが大変ですよね。
- 十分な長さのある文字列
- 辞書に載っていない、推測しづらい覚えやすい文字列
- 登録サイトによって使い分けし、使いまわしをしないこと
- 定期的に変えること
このあたりが、「良いパスワード」と言われる定番の条件でしょうか。
でもこれらの条件ってかなり厳しいんですよね。
特に「使いまわしをしないこと」
世の中に、いくつサービスがあると思っているのさ。そんなにたくさんパスワードを覚えてられるか!
というのが正直なところ。
ついでに「定期的に変えること」なんて(無茶な)条件をつけられてパニクって、
「もう無理。そんなに覚えられない・・・。全部"pass1234"でいいれす・・・」なんてやってしまいたくなります。
定番の対策
そこでセキュリティ専門家は言うわけです。
「ですよね。覚えてられないですよね。そこでパスワード管理ソフトですよ! 管理ソフトのパスワードさえ覚えておけば、他のサイト用のパスワードをとても長い複雑なものにしても大丈夫!」
うん。これは一つの解答です。しっかりと使いこなせば何の問題もありません。
でもね、
- あいぽんに管理ソフト入れてたけど電池きれたったww
あるある? そして、場合によっては、
- 管理ソフト自体のパスワードを自動入力モードにしてたんだけど、そのパスワードを忘れたったw
- もう忘れないように、この管理パスワード紙に書いてモニターの横に貼っておくわ!
さすがにこれはないかw
そこでもう一つの対策を提案
もうね。パスワード文字列覚えるのではなく、その場で作りましょうよ。
あらかじめパスワードを作るためのルールを自分で決めておいて、そのルールを使いまわしするわけです。
ただし、他人がパスワードを見て、一発でばれるようなルールではだめですよ。
複雑な自分ルールを決めておいて、それを使い続けるわけです。
たとえば例を挙げましょう。これ、あくまでも例ですからね。 これをベースにより複雑な作成ルールを決めるのは問題ありませんが、これをそのまま使うのはダメですからね。 一応念のため。
作成例
世界的に有名な、ちょーすごいサービス、「hevohevoドットコム」というものがあるとしましょう。 このサイトにユーザー登録するために、「いつも使っている自分ルール」を使ってパスワードを作ります。
- 自分ルールで、パスワードは12文字って決めておきます(一般的には8文字以上かな?)
- サイト名「hevohevo」を材料その1として使う
- 自分の独自のフレーズを2つ用意して、材料として使う
- フレーズその1は数字。記念日(誕生日は絶対にダメ。もっとプライベートで非公開なものをおすすめ。ド○テイ卒業日とかwww)など
- フレーズその2は文字列。たとえば自分の好きな曲のタイトルから取り出すなど、無意味に見える文字列
- さあここからはアレンジですよ。
- 「hvhv」(子音だけ取り出すなど4文字を抽出)+「0310」(無意味数字4ケタ)+「tyut」(無意味文字列4文字)→独自ミックス→「h03v10htyvut」
さあ、パスワード「h03v10htyvut」ができました!
このような「パスワード作成ルール」を一貫して使い続けるわけです。 かなり複雑なルールですが、これをずーっと使い続けているうちに、慣れてきてすぐにパスワードを作れるようになります。 継続は力なり。人間の能力ってすげぇ。
ポイントは、「サイトごとに新しいパスワードを作ること」「作るときに複雑な独自ルールを使うこと」「そのルールをどのサイトでも常に使い続けること」です。
さてここで、独自ルール自体はどのようなものがいいかを検討してみましょう。
独自ルールを関数として捉える
たとえば、作成例で使った作成ルールを関数f()と表記してみましょう。
そうすると、材料1「サービス名」、材料2「数字フレーズ」、材料3「文字列フレーズ」を使ってパスワードを作っているわけですから、 次のように表現できます。
パスワード = f(サービス名, 数字フレーズ, 文字列フレーズ)
ここではパスワードの材料に注目しましょう。 つまり、関数fの引数としては、どのようなものが望ましいのでしょうか。
個人的な意見ですが、まず、数字と文字列がバランスよく入っていることが望ましいと思われます。
そしてできるならば、記号が入るとさらに強固になります。たとえば「#」「!」など。 でもこれはサイトによって記号を受け付けないところもあるので一長一短ですね。
記号入れた堅牢なパスワード作ってドヤ顔で入力したら「半角英数字しか使えません」なんて言われて拒否られた。よくある話です。
先の例では引数3つの関数を紹介していますがこれを最低レベルとして、さらに独自に考えて、引数を増やすのをお勧めします。
またあるいは、サイトの重要度によってルール作成に使う関数自体を変えてしまうのもありかもしれません。 たとえば、次のようにサイトを重要度によってランク付けします。
- 入力した情報が漏れてもダメージはほとんどないというサイトを重要度1
- 個人情報とか入力しているので漏れるとかなりまずいというサイトを重要度2
そして、重要度2なら複雑な作成関数f()を使い、重要度1ならもっとシンプルな関数g()を使うなどのように関数自体を使い分けるのです。
まとめ
ここまでのポイントをまとめましょう。
- パスワード文字列を覚えるのではなく、パスワード作成のための独自ルールを作って覚えましょう。
- 他人から推測しづらい複雑な「作成ルール」を決めておき、それを常に使い続けること。
- 作成ルールを関数f()で表現するならば、
パスワード = f(サイト名, 数字フレーズ, 文字列フレーズ)
は、最低条件。できるならば、もっと引数を増やす。
- サイトの重要度(個人情報やクレカ情報など)によって、関数自体を使い分けるのも重要
問題点とその対策
この方法を使っているといくつか問題が出てきます。いくつか例を挙げましょう。
たとえば、個人的にあまり好きではないのですが、「パスワードを定期的に変えること」というパスワード条件があります。 この条件をクリアするために、たとえば、パスワードを更新した年を引数にするというのもありかもしれませんね。
パスワード = f(サービス名, 数字フレーズ, 文字列フレーズ, パスワード更新年)
あるいは漏えい事件などで、設定したパスワードを捨てなければならなくなったときは悩みます。
そんなサイトは利用をやめればいい。どうしても、そのサイトでパスワードを再設定しないといけない時には、そのサイトに対する評価を引数として与えるのはいかがでしょうか。
引数を増やしたくないというときには、文字列フレーズをその評価に置き換えればいいですよね。
パスワード = f(サービス名, 数字フレーズ, "bakabaka", パスワード更新年, )
あっそうそう。ここで油断して、辞書に載っている英単語を引数に使ってはダメですよ。 日本語の強みを生かしましょう。評価として"bad"などを使うのではなく、 "ahoaho"、"siroutokayo"、"kanritaiseihevosugi" のように日本語ローマ字表記がお勧めです。
(さりげなく某サイトをdisる手法w)
アレンジはいろいろ考えられます。みなさんもぜひ、自分なりのルールを考えてみてください。
余談1
Microsoftさーん。SkyDriveからOneDriveにサービス名を変えられると困るですけどー。
余談2
同じようなこと考えた人、実践している人はかなりいそうな気がします。ですので、今回の提案内容は、オリジナルを主張するつもりはありません。ご了承ください。
世の中にはきっと、高階関数でパスワード作っている人がいるはず。しかも瞬時に暗算で。
そこまで来るともう人間暗号機ですよね。