サーバにパスワードを渡さない方法を考える

サーバ側に重要なデータがあるから、 パスワードが流出したり、 (パスワードがバレると)なりすましが出来たりするわけです。 つまり抜本的な対策は「重要情報をサーバ側に置かない」ことと言えます。

ただし、 これを実現するためには、 クライアント側(パソコンメーカー、スマートフォンメーカーなど)の協力が必要です。

eBayの決済でおなじみPayPalとLenovoが組んで、 FIDO Allianceという組織を立ち上げるところから、この方法を作る動きが始まりました。 この方式(FIDO2)は、 今や主要なデバイス製造メーカーと主要クラウドベンダーが賛同する規格となっているので、 デファクトスタンダードと言えます。

おおまかなフロー

(初期化のところとか公開鍵暗号がどうとか詳細を省きますが)

  1. どこかのサービスに入ろうとすると
  2. サービス側から、 ユーザの使っているデバイス(パソコンやスマートフォン)に 「ユーザ本人ですかね?」と問い合わせが送られます
  3. ユーザは、自分のデバイスで認証します。 たとえば専用デバイスに指紋をくっつけて、 本人が操作していることを「デバイスに分からせます」
  4. デバイスは「本人ですよ〜」という報告だけをサービスに送り返します
  5. めでたくサービスに入れます

重要なポイントは、 「手元のデバイスは個人情報(認証情報)を知っていますが、サービス側は知らない」 ことです。 ユーザの手元のデバイスが「本人であることを確認」し、 デバイスが「本人ですよ〜という報告だけをサービスに送り返す」 ところが大事なのですね。

ダメな生体認証サービスに要注意

生体認証を唱っていても上のような仕組みではないサービスがありえます。 それでは従来のパスワード認証と同じになってしまうどころか、 もっとまずいことになります。

パスワードは何回でもリセット出来ますが、 生体認証データのヴァリエーションは少ないです。 指紋の場合、手の指10本が限度です (足の指も使えるでしょうけれど、現実的でないでしょう)。 顔なら一つしかないですよね。

よく調べずに、うかつに登録してしまう、 たとえば、 生体データ(例:指紋)を登録する=指紋の画像をアップロードしてしまい、 そのサービスから、その画像が流出したら、その指紋情報は二度と使えません。

デバイスは個人情報の何を知っているのか?

たとえばデバイスで指紋認証をする場合、 あらかじめデバイスに指紋の情報を登録します (そうでないと認証できません:-)。 デバイスは指紋の画像情報を持っているの?と言うと、 そういうわけでは、なく、 画像認識の特徴点情報だけを持っているだけらしいです( デバイスごとに実装は微妙に違いそうなので、 細かい情報まで覚えているデバイスがないのか? は自信ありません… まぁ、データ量が増えるから生に近い情報の保存は無いと思うんですけど…)。

歴史

  • 2013 FIDO 規格
  • 2018 FIDO2 規格

くわしくはこちら

リファレンス