増井ラボノート コロンブス日和

第8回EpisoPass

パスワードの諸問題

さまざまなWebサービスでユーザ認証のためにパスワードが使われています。パスワードはいろいろ問題が多いシステムであり、パスワードにかわるさまざまな認証システムが提案されてはいるものの、すべての点でパスワード認証より優れたシステムは存在しないと言われているので、パスワードによる認証がほかの方法で置き換えられる時代はすぐには来ないでしょう。

パスワードの最も嫌なところは、覚えておくのがとてもたいへんなことだと思います。パスワードを忘れて困った経験がない人はいないでしょう。いろいろなサービスで同じパスワードを使い回すのは危険ですし、パスワードはときどき変更したほうが安全だと言われていますが、複雑で長いパスワードをたくさん覚えておくことは不可能ですから、仕方なく同じパスワードを使い回している人は多いと思います。

異なるパスワードをすべて記憶することが不可能なのであれば、紙やファイルに書いておけば良いかもしれませんが、パスワード文字列をそのまま記録するのは危険なので、複数のパスワードを暗号化して覚えておくためのさまざまなパスワード管理システムが利用されています。たいていのパスワード管理システムは1つの「マスターパスワード」を利用してほかのすべてのパスワードを管理するようになっていますが、マスターパスワードは覚えておかなければなりませんし、パスワード管理システムはどこでも使えるとは限りません。できれば特殊なシステムを使うことなく、複雑な多数のパスワードを利用できるほうがうれしいでしょう。

そもそも強力なパスワードを作成してからそれを覚えたり管理したりするというやり方が間違っているのではないでしょうか。新しく作ったパスワードを覚えたり管理したりするのではなく、すでに知っていて忘れようがないような秘密の記憶を基にして、複雑なパスワードを生成して使うことにすれば、パスワードを覚えられない問題は解決するはずです。

EpisoPass

子供のころちょっと怪我をしたとか、イジメられた嫌な経験とか、うっかりした失敗を隠していたとか、他人に話したことはないけれども忘れることがないような秘密の記憶というものが誰にもたくさんあると思います。強い体験に基づく記憶は、エピソード記憶と呼ばれ、時間が経っても消えることがありません。一方、数式や電話番号を記憶しようとしてもなかなか覚えられませんし、覚えていたつもりでも時間が経つとキレイに忘れてしまっていたりするものです。このようなものは意味記憶と呼ばれ、エピソード記憶に比べると長期的な記憶が困難です。

パスワードがエピソード記憶だったら良いのですが、体験的にパスワードを覚えるのは無理でしょう。であれば逆に、忘れることがない秘密のエピソード記憶を基にして、パスワードを生成するようにすれば、秘密で複雑で忘れないパスワードを安心して使えるようになるはずです。

EpisoPassは、ユーザが忘れることがない個人的なエピソード記憶を、複雑な文字列に変換することによって安全なパスワードを生成するシステムです。

パスワード文字列は次の手順で生成されます。

  • パスワード生成の「種」となる文字列(シード文字列)を用意する
  • 忘れることがない個人的なエピソード記憶に基づく秘密の質問をいくつか作成し、それぞれについて1つの正答と複数の偽答を用意する
  • 質問と回答の組に基づいてシード文字列に換字操作を行う。すべてに正しく回答したとき生成される文字列をパスワードとして利用する

問題文字列とユーザが選んだ回答文字列を結合した文字列を生成し、そのMD5値を基にしてシード文字列を換字することによりパスワードを生成しています。

ブラウザでの利用

図1は私がTwitterのパスワードを生成するために、ブラウザでEpisoPassを利用しているところです。

図1 EpisoPassの利用例
図1 EpisoPassの利用例

シード文字列として「Twitter123456」という文字列を指定しており、4個の秘密の質問に対する回答選択に応じて、⁠Mfveabn574923」のようなパスワード候補が生成されます。

異なる答えを選択するとまったく異なる文字列が生成されます。

シード文字列を「Facebook123456」に変更すると、生成されるパスワードは図2のように変化します。このように、サービスごとに異なるシード文字列を利用することによってさまざまなパスワードを簡単に生成できます。

図2 EpisoPassによるパスワード生成
図2 EpisoPassによるパスワード生成

「いつのパスワードですか」のような質問を用意しておき、⁠2016/5」⁠2016/6」のような選択肢を用意しておけば、毎月異なるパスワードを生成できます。

シード文字列の8文字目が数字である場合はパスワードの8文字目も数字になるなど、シード文字列の文字種に対応したパスワード候補が生成されるようになっています。パスワードとして大文字/小文字/英数字/記号をすべて利用しなければならないサービスの場合は、シード文字列に「PassWord123!@」のような文字列を指定します。

最初の秘密の質問は私の小学校のときの体験に基づくもので、最後の質問は数年前の体験に関するものです。これらは古いエピソード記憶になっているので、私が将来答を忘れることはほとんど考えられませんが、私以外の人間がこのような質問に答えることは難しいので、正しいパスワードを得ることはできません。

秘密の質問と答はブラウザで編集でき、右上の[サーバにセーブ]ボタンを押すことにより、シード文字列、秘密の問題、答のリストがサーバにセーブされます。⁠ファイルにセーブ]ボタンを押すとJSONデータをパソコンにダウンロードでき、パソコン上のJSONデータをブラウザにドラッグドロップすると、サーバにアップロードできます。ユーザはどれが正答かを指定するわけではないので、問題データを見てもユーザのパスワードはわかりません。

Androidアプリケーション

ブラウザからWebサービスを利用する場合、ブラウザとサーバとの間の通信を盗み見されたり、パソコン上の操作を記録されたりする心配を完全になくすことはできません。ブラウザでEpisoPassを使う場合、パスワードはブラウザ内部でJavaScriptにより生成されるので、一度ページを表示したあとはネットワークを遮断してもパスワード計算できるのですが、ブラウザを使わずにパスワードを作成できるほうがより安心でしょう。このため、通信をまったく行わずにマシン単体でパスワード計算を行うためのAndroidアプリも用意しています。ページの右上の[Androidアプリ]ボタンを押すと、現在表示している秘密の問題と答を内蔵したAndroidアプリが、サーバ上でビルドされてダウンロードされます。Android端末でアプリを実行すると図3のような画面が表示されます。シード文字列を設定して[開始]ボタンを押すと図3のように質問が1つずつ表示され、ボタンを押してすべて回答するとパスワードが計算され図4のように表示されます。

図3 Androidアプリでの使用例
図3 Androidアプリでの使用例
図4 生成されたパスワード
図4 生成されたパスワード

回答の選択とパスワード計算はAndroid端末で実行されるため、端末を機内モードに設定するなどの方法でネットワーク接続を遮断した状態でもパスワードを計算できます。EpisoPassをインストールしたAndroid端末を持っていれば常に各種のパスワードを計算できるので、他人のマシンや公共の場所に設置されたパソコンなどでも、容易にTwitterなどのネットサービスを利用できます。

前述の方法でEpisoPassアプリをサーバからダウンロードする場合は、ブラウザ上で秘密の問題をサーバに登録する必要がありますが、秘密の問題をまったくネット上に露出することなくアプリを利用することもできます。秘密の問題を含まないEpisoPassアプリをGoogle Playで公開しているので、これを端末にインストールしたあと、ローカルマシンで作成した秘密の質問を端末に転送すれば、EpisoPass.comからダウンロードしたアプリと同様に利用できます。この手法を使うと秘密の質問が通信路を通ることがないので安全ですが、アプリのセットアップの手間は増えます。

EpisoPassの安全性

EpisoPassで選択枝が20個の質問を10個使用する場合、総当たりでパスワードを生成するには約10兆(=2010)通りの試行が必要になり、大小英文字からランダムに8文字を並べた約50兆(=528)通りの文字列からパスワードを選ぶ場合と同程度の強度になります。総当たり攻撃が可能なオフライン運用ではこのような強度は重要ですが、オンラインサービスでは、パスワード入力を何度か間違えるとサービスがブロックされるのが普通なので、それほど長いパスワードを用意する必要はないでしょう。

秘密の質問を利用する認証は脆弱だと言われることがあります。パスワードをリセットするために「母親の旧姓は?」⁠最初に飼ったペットの名前は?」のような質問に対してユーザに答えを登録させるサービスがありますが、このような問題は他人が調べたり推測したりすることが簡単ですし、秘密の質問の数は一般的に少ないので、パスワードよりも脆弱なのはたしかです。EpisoPassでは、他人には解くことが難しく自分では忘れないような秘密の質問をたくさん登録しておけば安全です。

秘密の質問の選択

EpisoPassでは、他人が推測することが難しく、自分は決して忘れないようなエピソード記憶を秘密の質問として利用します。忘れないエピソード記憶であっても、次のような性質を持つものは秘密の質問として不適当です。

  • 自慢になるもの(何かの機会にうっかり他人に自慢しまう可能性があるので)
  • ネット上に記録が残っているもの
  • 他人と情報を共有しているもの
  • 趣味や嗜好に関連するもの(他人に推測されやすいうえに嗜好が変化する可能性があるので)

このようなものではなく、⁠わざわざ人に話すことはないが自分の記憶に強く残っているような無難なエピソード記憶」を秘密の質問として利用するのが良いでしょう。例に挙げた「鉄条網で怪我した場所は?」という問題の場合、私はこの経験について他人に話したことはありませんし、今後自慢することがあるとは思えませんが、痛い思いをしたことは忘れませんから、問題として適切だと言えるでしょう。

偽答の作成方法

問題の種類によっては偽答の生成が難しかったり、答えが予測できたりしてしまう場合があります。たとえば「好きなスポーツは?」のような質問の場合、たくさんの偽答を用意することが難しいですし、本人を知っていたら想像がつくかもしれませんので問題としては適切でありません。

一方、答えが人名や地名の場合、正答に似た人名や地名を並べることは簡単です。たとえば「世田谷」が正答であるとき、⁠目黒」⁠杉並」のような偽答を用意するのは簡単です。例に挙げた「鉄条網で怪我した場所は?」という問題の場合、似たような地名をたくさん並べることが簡単なのでEpisoPassの問題として適切だと言えるでしょう。

ある単語と同じカテゴリに属する単語を探す「同位語検索」と呼ばれる手法がいろいろ提案されているので、これを利用して正答と同じカテゴリに属する単語を自動的にリストできれば、簡単に偽答リストを作ることができるでしょう。

私は数年前にEpisoPassを開発してから、FacebookやTwitterなどさまざまなWebサービスのパスワードの管理にEpisoPassを使っており、パスワードに関する悩みが完全に解消されました。パスワードで消耗している方はぜひご利用ください。

Software Design

本誌最新号をチェック!
Software Design 2022年9月号

2022年8月18日発売
B5判/192ページ
定価1,342円
(本体1,220円+税10%)

  • 第1特集
    MySQL アプリ開発者の必修5科目
    不意なトラブルに困らないためのRDB基礎知識
  • 第2特集
    「知りたい」⁠使いたい」⁠発信したい」をかなえる
    OSSソースコードリーディングのススメ
  • 特別企画
    企業のシステムを支えるOSとエコシステムの全貌
    [特別企画]Red Hat Enterprise Linux 9最新ガイド
  • 短期連載
    今さら聞けないSSH
    [前編]リモートログインとコマンドの実行
  • 短期連載
    MySQLで学ぶ文字コード
    [最終回]文字コードのハマりどころTips集
  • 短期連載
    新生「Ansible」徹底解説
    [4]Playbookの実行環境(基礎編)

おすすめ記事

記事・ニュース一覧