【社内勉強会資料】パスキー入門

# 前書き

2022年からパスキーに関する動きが慌ただしいので、チーム内で勉強会を実施しました。
この記事はその際の資料です。

私はセキュリティを専門とするITエンジニアではないので、もし誤った記述などがありましたらコメントや編集リクエストでお知らせいただけると幸いです。

この記事は2023年5月現在の情報を元にしています。

# パスキーの概要

ざっくり言うと「パスワードを使わないユーザー認証の仕組み」です。
パスワードに代わって公開鍵暗号方式を使い、秘密鍵をデバイス側に、公開鍵を各サービスのサーバーに保持します。（詳細は後述）
「パスキー」はその秘密鍵を指し、かつ、Apple、Google、Microsoftがその普及のために命名したブランド名でもあります。

仮にサーバーへのサイバー攻撃等で公開鍵が流出しても、その名の通り公開する前提の情報なので悪用できません。
デバイス側に保持された秘密鍵がないとログインできませんし、また秘密鍵はサーバーには送信しないため、フィッシング被害のリスクも限りなく低いです。

また、パスキーは自動的に生成され使用されるため、パスワードのように考える＆覚えておく必要がなく、生体認証を利用するためタイプする手間もありません。

Apple、Google、Microsoftがその拡大に協力することを表明し、各プラットフォームでの対応が進んで普及への土台が出来つつあります。

2023年5月現在で調べた範囲では以下のサービスで対応済みとのことです。

- Yahoo!
- NTTドコモ（dアカウント）
- KDDI (au ID)
- Googleアカウント

# デモ

iPhoneで、パスキーを体験できるサービス「[passkeys.io](https://www.passkeys.io/)」を利用し、ユーザー登録〜ログインまでを体験してみました。↓
<iframe width="358" height="636" src="https://www.youtube.com/embed/_g6uis0Zs2s" title="Passkeys.ioでパスキーを体験してみた" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

パスキーはiCloudキーチェーンに保存されています。↓
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122917/7ae37ddc-cb04-949d-56b0-160a59be77b5.png" width=375>

パスキーの詳細を開いた画面です。↓
画面右上のシェアボタンにて、同じアカウントを共用している家族などにAirDropを用いてパスキーをシェアすることもできます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122917/6c28ebd4-3180-0b69-7ea3-49686f74a31a.png" width=375>

上のiPhoneと同じAppleIDが設定されているMacでは、iCloudキーチェーンに保存されたパスキーを使ってログインできます。↓
（※ログインIDが変わってしまってます。手順をミスってやり直しました。）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122917/834ddb06-cfe5-b7e7-f2ba-4c0bb53dd22d.png">

別なMacの場合（iCloudキーチェーンに当該サービスのパスキーが無い場合）、パスキーを保存したiPhoneでQRコードを読み取ることでログインできます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122917/8712a33d-9569-7b40-839a-e9848619139b.png">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122917/abc2f450-b709-9281-ae7a-a13966254a90.png">

# FIDO2とパスキー

## FIDO2の概要

FIDO（Fast Identity Online の略。読み方は「ファイド」）はパスワードの代わりに公開鍵暗号方式を使った認証の仕組みであり、FIDO Allianceという団体によって標準化された仕様です。
パスキーの登場前から、例えばPCにUSBで外付けするタイプの「認証器」を使ったFIDOベースの認証があります。

2023年時点の最新仕様であるFIDO2も、パスキーのために制定された標準仕様というわけではありません。
FIDO2はFIDO AllianceとThe World Wide Web Consortium（W3C）によって制定されました。

FIDO2には以下の仕様が含まれます。

- WebAuthn（Web Authenticationの略。読み方は「ウェブオースン」）
    - FIDOベースの認証の仕組みをブラウザから利用できるようにするための仕様
- CTAP（Client To Authenticator Protocolの略。読み方は「シータップ」）
    - 外部認証器とBluetoothやUSB等を介して認証情報をやり取りするためのインターフェイス仕様

2018年以降、主要なブラウザではすでにWebAuthn APIが利用可能となっています。

## パスキーとFIDO2の関係

FIDO2では、複数デバイスでの認証情報の登録が煩雑である点や紛失・故障時にログインできなくなることが懸念とされてきました。
パスキーでは、Appleの場合はiCloudキーチェーン、Googleの場合はパスワードマネージャーに保持しデバイス間連携を実現することにより、この懸念を解消しています。

パスキーが使えるプラットフォームは、[FIDO Allianceによると](https://fidoalliance.org/passkeys/?lang=ja)2023年5月現在で以下の通りとされています。（原文は英語、下記引用はGoogle翻訳）

> Apple は、2022 年 9 月に iOS 16、2022 年 10 月に iPadOS 16 と macOS Ventura でのサポートを発表しました。
> Google は、2022 年 10 月から Android でのサポートを発表し、2023 年までに ChromeOS でのパスキーのサポートを計画しています。
> Microsoft Windows は 2023 年にサポートを提供する予定です。

# 処理フロー

## ユーザー登録

![スクリーンショット 2023-05-10 17.27.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122917/2bd04eda-fe96-0dbe-463a-13e0075a3d25.png)

## ログイン

![スクリーンショット 2023-05-10 17.28.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122917/5bd0ad05-3032-07bf-ef56-e4ffd3574183.png)

# 参考にさせていただいた記事

## パスキー関連

https://blog.agektmr.com/2022/12/passkey.html

https://support.apple.com/ja-jp/guide/iphone/iphf538ea8d0/ios

https://developer.apple.com/jp/passkeys/

https://quickbirdstudios.com/blog/ios-passkeys/

https://engineers.fenrir-inc.com/entry/2023/02/27/095922

https://techblog.yahoo.co.jp/entry/2023080730431354/

## FIDO2関連

https://blog.agektmr.com/2019/03/fido-webauthn.html

https://qiita.com/noby111/items/bfb50b65751c83340b99

https://www.okta.com/jp/blog/2019/04/the-ultimate-guide-to-fido2-and-webauthn-terminology/

https://dev.classmethod.jp/articles/passwordless-authentication-and-fido2/

## その他

http://www.comm.tcu.ac.jp/~math/hnakai/infomath/rsa.html