サーバにパスワードを渡さない方法を考える
サーバ側に重要なデータがあるから、 パスワードが流出したり、 (パスワードがバレると)なりすましが出来たりするわけです。 つまり抜本的な対策は「重要情報をサーバ側に置かない」ことと言えます。
ただし、 これを実現するためには、 クライアント側(パソコンメーカー、スマートフォンメーカーなど)の協力が必要です。
eBayの決済でおなじみPayPalとLenovoが組んで、 FIDO Allianceという組織を立ち上げるところから、この方法を作る動きが始まりました。 この方式(FIDO2)は、 今や主要なデバイス製造メーカーと主要クラウドベンダーが賛同する規格となっているので、 デファクトスタンダードと言えます。
おおまかなフロー
(初期化のところとか公開鍵暗号がどうとか詳細を省きますが)
- どこかのサービスに入ろうとすると
- サービス側から、 ユーザの使っているデバイス(パソコンやスマートフォン)に 「ユーザ本人ですかね?」と問い合わせが送られます
- ユーザは、自分のデバイスで認証します。 たとえば専用デバイスに指紋をくっつけて、 本人が操作していることを「デバイスに分からせます」
- デバイスは「本人ですよ〜」という報告だけをサービスに送り返します
- めでたくサービスに入れます
重要なポイントは、 「手元のデバイスは個人情報(認証情報)を知っていますが、サービス側は知らない」 ことです。 ユーザの手元のデバイスが「本人であることを確認」し、 デバイスが「本人ですよ〜という報告だけをサービスに送り返す」 ところが大事なのですね。
ダメな生体認証サービスに要注意
生体認証を唱っていても上のような仕組みではないサービスがありえます。 それでは従来のパスワード認証と同じになってしまうどころか、 もっとまずいことになります。
パスワードは何回でもリセット出来ますが、 生体認証データのヴァリエーションは少ないです。 指紋の場合、手の指10本が限度です (足の指も使えるでしょうけれど、現実的でないでしょう)。 顔なら一つしかないですよね。
よく調べずに、うかつに登録してしまう、 たとえば、 生体データ(例:指紋)を登録する=指紋の画像をアップロードしてしまい、 そのサービスから、その画像が流出したら、その指紋情報は二度と使えません。
デバイスは個人情報の何を知っているのか?
たとえばデバイスで指紋認証をする場合、 あらかじめデバイスに指紋の情報を登録します (そうでないと認証できません:-)。 デバイスは指紋の画像情報を持っているの?と言うと、 そういうわけでは、なく、 画像認識の特徴点情報だけを持っているだけらしいです( デバイスごとに実装は微妙に違いそうなので、 細かい情報まで覚えているデバイスがないのか? は自信ありません… まぁ、データ量が増えるから生に近い情報の保存は無いと思うんですけど…)。
歴史
- 2013 FIDO 規格
- 2018 FIDO2 規格
くわしくはこちら