ログインにはなぜ username と password が必要なのか?〜 簡単ログインを目指して
永遠の生魚おじさん、都元です。最近カメラ沼にはまりました。レンズ沼というよりアクセサリ沼にはまりそうです。ピークデザインかっこいい。
さて、弊社は本日を最終営業日として、これから冬季休業となります。 今年も一年、どうもありがとうございました。というわけで書き納め三本締めの二本目。
ログインに必要なもの
みなさん、サイトやアプリにログインする時には何を入力するでしょうか? そう、username と password ですね。ログインにおいては、システムが利用者を認証する必要があるためです。
認証を行う根拠となりうるのは、古今東西、次の3種類しかありません。
- Inherence factor (WHAT YOU ARE) の提示。本人自身を提示する手法です。指紋・声紋・顔貌・容姿・静脈や虹彩のパターンなどがこれにあたります。
- posession factor (WHAT YOU HAVE) の提示。本人しか持っていないはずのものを提示する手法です。身分証明書・認証トークン・携帯電話・割符などが代表的です。
- knowledge factor (WHAT YOU KNOW) の提示。本人しか知らないはずのものを提示する手法です。パスワード・合言葉などを使います。
認証に足りる4つ目の要素を見つけたら、それは大発見であると思うので、こっそり私に教えてください。特許取得して、一緒にボロ儲けしましょう。
password だけでログインできないか、考えてみる
認証というのは面倒なもので、利用者に余計な手間を掛けさせてアクティブ率を下げたくないと日夜工夫を凝らす我々にとっては、やり玉に上がりやすいテーマであると思います。では、ログインの時に username の入力を省略できないか、という話が出たとします。
まぁ結論から言えば難しいのですが、それはなぜでしょうか。
まぁ、全員が衝突しない複雑なパスワードを使っていれば実現可能ですが、現実的には偶然にも同じパスワードを利用している利用者が複数人いる可能性があります。まさかパスワード登録 (or変更) 時に「このパスワードは他の人が使っています。別のパスワードを入力してください。」などと言うわけにもいかず。そのパスワードを使えば、自分以外の誰かとしてログインできるってことが分かってしまいます。
識別と認証
実はログインというのは識別と認証という二段階の作業をしています。まず識別ですが、これは例えば「利用者の username は miyamoto である」という前提を仮定する作業です。ただし、あくまでも仮定です。その上で、認証というのはその仮定を証明する作業です。
通常の username と password によるログインは、識別の責任が利用者側にあります。利用者が、自分の identifier (ID) を示す必要があるからです。
一方で前述の「password だけでログイン」というのは、識別の責任がシステム側にあります。パスワードが重複してしまった場合であっても「この人を誰であると仮定して認証をするのか」を決めるのはシステム側の役割になってしまうからです。
スマホにおける認証
iPhone のロック解除の際にも認証がありますよね。これはパスワードだけの入力だったりします。しかしこの認証は特殊ケースです。というのは、スマホに対して利用者は1人だけであるという前提があるからです。
つまり、識別の必要がないのです。それゆえに、パスワードだけ、指紋認証だけ、顔認証だけでロックの解除が容易にできるようになっています。
スマホアプリにおける認証 (Touch ID および Face ID 編)
認証というのは面倒なもので、利用者に余計な手間を掛けさせてアクティブ率を下げたくないと日夜工夫を凝らす我々にとっては、やり玉に上がりやすいテーマであると思います。(再)
では、ログインに指紋認証や顔認証は使えないか? ほら、スマホもスマホアプリも大して変わらんやん…。
私自身 iOS の Touch ID や Face ID の API には詳しくはないのですが、これらは「端末上で認証に成功したか失敗したか」を返してくれる機能しか持っていません。願わくば Apple ID あたりをベースに、耐タンパー性のあるハードウェア内に安全に保持した秘密鍵を使って電子署名を吐いてくれれば、Appleが広く頒布した公開鍵を使ってユーザーの認証もできるのですが…。
まぁ、個人情報に対する世間の意識の高まりもあり、利用者の identifier の取り扱いにも細心の注意を払う必要があるため、これが難しいのも納得です。
というわけでですね、iPhone のロック解除は「Apple 製品のための認証」だから Touch ID や Face ID が有効に使えるだけで、「我々のアプリのための認証」を同じ仕組みに乗せるのには無理があるのでした。
スマホアプリにおける認証 (自前サーバー実装編)
じゃあ、自前のサーバーを用意して、そのサーバー内で顔判定してみたらどうでしょう!! もし私がクラッカーだったら、あなたの顔写真や指の写真を撮って、それをこのサーバーに送りつけて遊びます。
まぁ仮に諸々の工夫によって上記のリスクが回避できたとしても。顔や指紋から利用者の ID を仮定する作業、つまり識別の責務がシステム側にあることにやはり注意が必要です。双子ちゃんの対策とか、万一似ている指紋の持ち主がいた場合、どうしますか?
でもあのアプリは Touch ID でログインできるよ
そうですね。そういうやつ、ありますね。
でもそのアプリには username と password が無い、というわけではないはずです。おそらく、username と password の組み合わせ、もしくは username と password に基づいて取得した OAuth のアクセストークンなどを、iOS の KeyChain に保存しているのでしょう。
Touch ID での確認が取れた場合に限り、KeyChain の中身にアクセスできるようにすることで、二次的な認証として実装したものであると思います。
まとめ
本稿で言いたいことを一言で言えば、思いつきで簡単ログインを作ろうとすると危険ですよ、ということです。
優秀な人材を多数抱えているであろう某GAFAでさえ、いずれも username と password による認証がベースになっていることを思い出してください。彼らも色々、新しい手法を考え出そうと日々努力しているはずですが、2018年現在、username と password による認証がすべての基礎になっており、簡単に逃げられるものではないのです。
みなさま、良いお年をお迎えください。