Loading
BLOG 開発者ブログ

2024年9月6日

Passkeyによって認証は楽になるのか?

こんにちは、shibamです。

「パスキー(Passkey)」という言葉はご存知でしょうか。パスワードレス認証の要となる技術であり、認証の3要素における「所持」(または「生体」、あるいはそのどちらも)を利用して認証を行うために、端末のロック解除情報を利用して認証を行います。
これによって、ユーザはパスワードを覚える必要がなくなり、より簡潔に認証を行うことができるようになります。
今回は、このPasskeyがどのようにして成り立つ技術であるのか、またこの技術が浸透することでどんな恩恵が得られるのかについてお話したいと思います。

目次

  1. TL;DR
  2. Passkeyとは
  3. 公開鍵暗号方式とは
  4. 何故、Passkeyは安全なのか
  5. Auth0でPasskeyを試してみよう
  6. 最後に

1.TL;DR

  1. Passkeyは、パスワードの代わりに生体情報を利用し、パスワードレス認証を実現する技術。
  2. これによってユーザはパスワードを覚える必要がなくなり、また情報窃取に対しても堅牢な仕組みを実現可能。
  3. 非常に便利だが情報の紛失には弱く、クラウドへのバックアップはほぼ必須。バックアップ可能なPasskeyを「Synchronous Passkeys(同期パスキー)」と呼ぶ。
  4. Windows Helloなどは現状端末保管のため、PCを紛失した場合にアカウントログインができなくなるなどの問題を抱えている
  5. 認証の負担軽減や、より強固なセキュリティを持った認証に大いに役立つ技術ではあるが、普及はもう少し先になりそう

2.Passkeyとは?

Passkeyについて

まず、Passkeyとはどんなものかについてご紹介いたします。
Passkeyは、パスワードの代わりとして端末のロック解除情報(生体や、PINなど)を用いるための技術です。
認証はユーザが生成した秘密鍵と公開鍵のペアを利用して行うため、管理者はユーザと公開鍵情報を紐付けるだけでよく、またサーバ上に存在する情報は公開鍵なので窃取や改ざんに対しても強固です。
これによって、

  1. ユーザ(+管理者)は、パスワード情報を保管する必要がなくなる。
  2. 管理者は、パスワードを安全に保管するための工夫を考慮する必要がなくなる。(ハッシュ化などなど…)

のような、ユーザにとっても管理者にとっても恩恵のある認証方式になります。

公式の声明

Passkeyについて、FIDO allianceでは以下のように解説しています。

FIDO標準に基づくパスキーは、パスワードに代わるもので、ユーザーのデバイスにまたがるウェブサイトやアプリへのサインインを、より速く、より簡単に、より安全にする。 パスワードとは異なり、パスキーは常に強固でフィッシングに強い。

Passkeyは、アプリやウェブサイトのアカウント登録を簡素化し、使いやすく、ユーザーのほとんどのデバイスで機能し、物理的に近くにある他のデバイスでも機能する。

つまり、「従来の(パスワード以外も含めた)認証方式よりも便利で強固な認証方式」だよ、というのが公式の見解になります。

3.公開鍵暗号方式とは

Passkeyは、(CRYPTRECの技術分類で言うと)公開鍵暗号/署名方式によって実現されています。
では、公開鍵暗号(およびその技術を応用したデジタル署名)方式とはなんでしょうか?

公開鍵暗号方式

公開鍵暗号方式は、暗号化と復号化に異なる鍵を利用する方式であり、このとき暗号化に用いる鍵を公開鍵、復号化に用いる鍵を秘密鍵と呼んでいます。
公開鍵は、その名の通り公開可能な鍵であり、公開鍵によって暗号化された文書を公開鍵によって復号化できないため、悪意ある第三者に対して公開鍵が漏れた場合にも情報漏洩被害が発生しづらいです。
秘密鍵は、キーペアの作成者が安全に保管しておくべき鍵となります。(公開鍵と秘密鍵という鍵があるというよりは、キーペアを作成し、暗号化に用いる鍵は公開してよいが、復号化に用いる鍵は安全に保管する、と認識しておいても良いと思います。)

デジタル署名

デジタル署名においては、上記の公開鍵暗号方式を応用し、秘密鍵を用いて署名を行い、公開鍵を用いて検証を行うことを指します。
「署名」という行為の目的は「送信元が誰かを保証すること」にあるので、鍵の所有者が複数に渡っている公開鍵ではなく、鍵の所有者が一人である秘密鍵を用いて署名を行います。
暗号化処理を行うのではなく、あくまで送信元の正当性を保証するための手段になるので、これを暗号化に利用することはできません。

暗号/署名アルゴリズム

公開鍵暗号/署名方式と呼ばれる方式の中で有名なアルゴリズムとしては、ECDSA(楕円曲線デジタル署名アルゴリズム)辺りかと思います。
ECDSAについては、DSAとともに安全性に対して懸念のあるアルゴリズムと言われているので、EdDSA(エドワーズ曲線デジタル署名アルゴリズム)も押えておきましょう。

4.何故、Passkeyは安全なのか

公開鍵は「公開されていい鍵」

上記の説明の繰り返しとなってしまいますが、公開鍵暗号方式において「公開鍵を窃取されること」が大きなリスクになる確率は低いです。
素因数分解の困難性によって、公開鍵から秘密鍵を類推することはほとんど不可能であるため、暗号化した情報を復号化する手段を持たないからです。
また、同様に、デジタル署名を行う鍵は秘密鍵側であることから、公開鍵を窃取したところで署名された内容の検証しかできません。

Passkeyは公開鍵暗号/署名方式を採用している

Passkeyは、公開鍵暗号/署名方式を採用しており、Passkeyによって登録される認証情報は「ユーザを紐付ける情報」と「認証機が発行した公開鍵」になります。
パスワードを持たないことから漏洩によるリスクが小さく、前述した通り公開鍵の漏洩によって生じるリスクもほとんどありません。
これはユーザにとっても、またアプリケーションの管理者にとっても大変ありがたく、パスワードを管理することによるコストを大きく削減することができます。

Passkeyはオリジン単位で公開鍵の送信先を覚えている

Passkeyによる認証を実装する場合、「どのオリジンが、どのRPに対して認証を行うのか」を明示する必要があります。
また、Passkeyによって登録を行った場合、認証機は「どのオリジンの、どのRPに対して公開鍵を送ったか」を覚えています。
そのため、「登録したことのないオリジン」に対してPasskeyの認証を行うことはできないため、フィッシングサイトによるPW窃取の被害などを防ぐことができるようになります。

5.Auth0でPasskeyを試してみよう

Auth0によるPasskeyの実現

Auth0においては、以下の条件を満たすことで、認証方法としてPasskeyを選択することができるようになります。
満たしていない条件がある場合、該当する項目がPENDINGと表示されます。

  1. Custom Login Page must be disabled
    Auth0のカスタムログインページ機能を無効化する。これは、カスタムログインページがClassic Universal Loginに依存しているからです。
  2. Requires username must be disabled
    Databaseの設定で”Require Username”をOFFにしましょう。デフォルトはOFFです。
  3. Use my own database must be disabled unless Import Users to Auth0 is enabled
    Auth0が持つDatabaseを利用することが前提となります。独自のDBの利用は不可です。
  4. New Universal Login Experience must be enabled
    New Universal LoginをONにしましょう。
  5. Identifier First login flow must be enabled
    これは忘れがちなのですが、Authentication Profileから”Identifier First”を設定しましょう。

設定が完了すると、それぞれの項目の右側にDONEと表示され、先頭行にREADYが表示されます。

これでAuthentication Method上からPasskeyを選択することができるようになります。
これでPasskeyが利用できるようになりました。

動作確認

実際にPasskeyを試してみましょう。
Passkeyの実行が可能な端末(スマホ等)で、先ほどPasskeyを有効化したDatabaseに対して”Try Connection”を実行します。

 

(以下はスマホ端末から確認)
Try Connectionボタンを押下すると、以下の画面に遷移します。

 

画面下部に”Continue with a passkey”が追加されていますね。
今回はまず、Sign upを試してみたいので、Sign upを選択。
すると、

Email addressの入力を求められるので、入力してContinue.

Passkeyの生成を要求されるので、Create a passkeyを選択

(iphoneの場合)Face IDを使用してパスキーを作成します。
続けるを押下してFace ID認証を実施。

 

完了画面が表示されます。これでパスキーの作成が完了しました。
今度はログインしてみましょう。

 

ここで、Continue with a passkeyを選択。

 

該当するオリジンに対して、複数のパスキーが登録されている場合、アカウント単位でのパスキーをこのタイミングで選択可能です。


これでログインも確認できました。
以上で動作確認完了です。

最後に

Passkeyは、安全性と利便性を兼ね備えた、これからの認証手段としてはかなり有力な選択肢の1つになります。
一方で、「Andwoid⇔iOS間の機種変更時にPasskeyの移行が難しい」ことや、「クラウド上に秘密鍵を置くことによる窃取リスクの増加」など、考慮すべき懸念も存在します。
Passkey認証によるメリット・デメリットを精査しながら、是非導入について一度検討してみてください。
 

 

shibamのブログ