今日の認証における課題(ぼくなりの認証論)
オンラインでパーソナルなサービスを利用する際に必ず必要になる「認証」。今回は認証論というか、そもそも認証ってなに、という話。
理論上、認証に利用できるもの
認証とは、「本当に私です」と証明するということ。なにをもって「証明」とするのか。
今日、一般的には次のように言われる。
- 知識
- 所有物
- 生体
つまり、「その人でなければ持っていないもの」。
知識
その人しか知り得ないこと。
最も一般的なのはパスワード。ほかには秘密の質問など。
長所
最も手軽で、ハードや環境に依存しない。
短所
使い回せば危険だし、使いまわさなければ管理がくそめんどくさい。
あと、忘れる可能性が常にある。
所有物
その人しか持ち得ないもの。
オンラインバンキングに使うワンタイムパスワードカードなど。あれはFIDOと呼ばれる仕組みで、ざっくりいえばワンタイムパスワードカードの工場出荷時に乱数生成規則とアカウントを紐づけておいて、認証時に手元のワンタイムパスワードカードとサーバーで出す乱数が同じなら(=同じ規則=正規のワンタイムパスワードカード)認証完了というもの。
最近はYubiKeyやGoogle Titanなど次々とエンドユーザー向けプロダクトが登場している。
サービスベンダーとして導入するには、APIを利用する。(キーデバイスごとにIDが割り振られているので、IDとワンタイムパスワードの組み合わせをAPIで問い合わせる)
あと、普通にメールアドレスとか電話番号、住所への郵送。所有者しか連絡内容を確認できないもの。
しかし「パスワードがわかればメールアドレスにアクセスできる」みたいな大元での認証がどうなっているかを考える必要がある。
長所
持ってさえいればいいので、管理がめっちゃ楽。
短所
失くす、盗まれるなど。あと、認証用のハードウェアをユーザーに持たせるのはなかなかハードルが高い。オンラインバンキングなどのセキュリティが重要なものか、組織内利用くらいの規模でないと厳しい。
あと、ワンタイムパスワードの場合、YubiKeyなどの外部サービスを利用すれば依存になるし、利用しなければ相当管理運用が大変。
所有物へのアクセスにパスワードなどを利用している可能性がある。本当に信頼できる所有物か考える必要がある。
生体
指紋認証、顔認証、虹彩認証、声紋認証、静脈認証など。
将来的には一番有望視されてると思う、が、現状はまだ技術が追いついてない。でもマシンラーニングによってもうすぐ実用的になるのでは?
現状、AppleのTouch IDやFace IDが最強だと思う。
長所
忘れない。なくさない。盗まれない。
短所
技術依存。いまのところ、ハード依存。(必要なハードがまだコモディティ化してない)
現実世界の「人-人」の「認証」って
さて、ところで、現実世界でぼくらは毎日「目の前にいる人は〜〜さんだ」と「認証」して、大事な情報をべらべら喋っている。
この「認証」には何を利用している?
生体
まずは当然、生体。
顔。声。
知識
それから、前回会ったときに自分がみた「彼」との整合性。
喋る内容、動きなど。
「複合的」な認証
現実世界でぼくらが人を認証するとき、単一の基準(顔だけ、など)でやっているわけではない。
たとえば「顔だけ」なら整形手術でごまかせるかもしれない。
でも、「顔」と「声」みたいに組み合わせれば、一気に認証精度が高まる。
単一の認証に頼るのは危険
認証はこれらのうち最低2つ以上を組み合わせて行うべき。そして可能なら「知識&知識」とかではなく「知識&所有物」みたいに違う種類のものを組み合わせる。
- 知識:パスワード、秘密の質問
- 所有物:ワンタイムパスワード、メールアドレス、電話番号、郵送
- 生体:指紋、顔、虹彩、声紋、静脈
ユースケース
一般的に利用されている認証の組み合わせ。
メールアドレス&パスワード&電話番号
最も一般的かと思う。電話番号というのはだいたいは2段階認証の際に利用される。
手軽だが、メールアドレスには普通はパスワードでアクセスする。それに、電話番号へのアクセスは意外と簡単。電話回線キャリアに電話してうまく「本人だ」と思わせればアクセスできる。
参考:NISTが警告、SMSでの二段階認証が危険な理由 - ZDNet Japan
メールアドレス&パスワード&ワンタイムパスワード
オンラインバンキングなど。
なかなかバランスがとれているが、「ワンタイムパスワードなくしたとき問題」は解決できていない。
パスワード or 顔認証
iPhone Xシリーズのロック解除に利用されている。手軽かつセキュアで、かなり勝手はいい。
しかし、双子がロック解除できてしまう問題のほか、普通にパスコードを忘れたら詰むのがiPhoneの伝統的な仕様。
あと、ハード依存。
人かロボットか
ここまでは、認証の対象は「人」が前提だった。
それ以前に「人かロボットか」を見分けることも重要。
だが、この部分の話は本質的でないと思う。結局ロボットを動かしているのは(マトリックスの世界にならない限り)人。
「人とロボットの違いを見分ける技術」というのは結局は「人っぽく見せる技術」とのいたちごっこにしかならない。
「本人か、それ以外か」で考えていいと思う。
結局は確率論
生体とか所有物とかいろいろ工夫してはみても、結局はこれらをすべてバイナリデータにして認証可否の判断をすることになる。
ので、どうやっても「たまたまぴったり正しい数値を入力できてしまった」という可能性は0にできない。
が、めちゃくちゃ低い確率にすることはできる。1回のトライでランダムな値を渡して通る確率をめちゃくちゃ下げて、あとは複数回のトライを制限すればいい。