Open15

パスキー認証による暗号化/復号化について

Hidden comment
taizo-taizo-

パスキーはどのように動くか?

※サーバー: サービスのこと(内部的な処理がわかりやすいようにサーバーと表記する)

新規登録

  • ユーザーがサーバーに登録する際に、デバイス上でパスキー公開鍵パスキー秘密鍵のペアを生成する。
  • パスキー公開鍵はサーバーに送信され、パスキー秘密鍵はデバイス内に安全に保存される。

ログイン

  • ユーザーがサーバーにログインをしようとする
  • サーバーはチャレンジ(ランダムなデータ)を生成して、ユーザーのデバイスに送信する
  • ユーザーは生体認証などで本人確認を行う
  • デバイスはパスキー秘密鍵を使って、チャレンジに署名する
  • 署名をサーバーに返す
  • 新規登録時にサーバーに保存した、パスキー公開鍵を使って確認する。
  • 正しければログインが許可される
taizo-taizo-

パスキー秘密鍵の保管場所は?

iOS

  • デバイスのセキュアエンクレープに保管される
  • セキュアエンクレープは、秘密鍵を外部からアクセスできないように保護する専用のプロセッサ。

ref. https://support.apple.com/ja-jp/guide/security/sec59b0b31ff/web

Secure Enclaveは、AppleのSystem on Chip(SoC)に組み込まれた専用のセキュリティサブシステムです。Secure Enclaveはセキュリティ層を追加するためにメインプロセッサから隔離されており、アプリケーションプロセッサのカーネルが侵害された場合でも、ユーザの機密データを安全に保てるように設計されています。

Android

  • デバイスのTEE(Trusted Execution Environment)に保管される

ref. https://developer.android.com/privacy-and-security/keystore?hl=ja

鍵マテリアルは、高信頼実行環境(TEE)やセキュア エレメント(SE)など、Android デバイスのセキュア ハードウェアにバインドできます。鍵に対してこの機能が有効化されていると、その鍵マテリアルがセキュア ハードウェアの外部に漏洩することはありません。

ブラウザ

ref. https://www.w3.org/TR/webauthn/#sctn-api

登録の流れ

taizo-taizo-

パスキーでデータは暗号化できる?

  • できる。厳密には、最近できるようになった。
  • 今まではユーザーが入力したパスワードを基に暗号化を行っていた
  • それがPRF拡張機能の出現によって状況が変わった

ref. https://blog.1password.com/encrypt-data-saved-passkeys/

That changes with the Pseudo-Random Function (PRF) extension. Now, passkeys stored in 1Password can also be used for encryption.

PRFとは?

  • 与えられた入力に対して、ほぼランダムかつRelying Partyごとに固有の暗号化キーを生成する関数のこと
    • 生成された値は一見ランダムに見えるが、実際には入力とPRFの内部の状態によって一意に決まる。
  • パスキーの背後にあるプロトコルであるWebAuthnの拡張機能でもある。

Relying Partyとは?

IDプロバイダー(IdP)が提供する認証サービスを利用する側のシステムやサービスのことを指す。
つまり、パスキーを実装するサービスのことを言う。

taizo-taizo-

PRFとPRF拡張機能は何が違う?

特徴 PRF PRF拡張機能
定義 擬似乱数生成の基礎となる関数 PRFをベースに拡張した機能
目的 ランダムな値の生成 PRFの機能を拡張し、より複雑な処理を実現
用途 暗号化、ハッシュ関数など パスキーの暗号化、PRF対称鍵の導出など

ref.
https://bitwarden.com/ja-jp/blog/prf-webauthn-and-its-role-in-passkeys/#what-is-prf-and-how-does-it-work

taizo-taizo-

PRF拡張によって導出された対称鍵は何に使う?

  • パスキーデータの保護
    • パスキーに関連する機密データを暗号化して安全に保管する(例. ユーザーの生体情報やデバイス固有の情報など)
taizo-taizo-

PRF対称鍵の導出方法は?

ざっくりとした流れ

  1. WebAuthn対応のブラウザを使用する
    • ChromeやFirefoxなど、WebAuthnをサポートしているブラウザが必要
  2. WebAuthn APIを利用する
    • JavaScriptでWebAuthn APIを呼び出し、ユーザーに認証を促す
  3. PRF拡張機能を使う
    • 認証が成功すると、PRF拡張機能を使って乱数を生成する
  4. 対称鍵を生成する
    • 生成された乱数を元に、任意の鍵生成アルゴリズム(例えば、HKDF)を使って対称鍵を作成
  5. データを暗号化する
    • 作成された対称鍵を使って、AESなどの暗号化アルゴリズムでデータを暗号化
    • 共通鍵暗号化方式の中で、AESが最も広く利用されており、高いセキュリティ性能を持つ。

ref.
https://blog.millerti.me/2023/01/22/encrypting-data-in-the-browser-using-webauthn/
https://levischuck.com/blog/2023-02-prf-webauthn#heading-registration

taizo-taizo-

bitwarden Community Forums から得た情報メモ1

以下はあくまで参考情報として受け取る。
明確に環境情報が記載されているわけではないので。

https://community.bitwarden.com/t/login-with-passkey-use-for-vault-encryption/62085/11
https://community.bitwarden.com/t/login-with-passkey-use-for-vault-encryption/62085/57

I have found that passkey encryption will not work on Windows 10 using any browser. I tried 4 PCs. I upgraded one to Windows 11 and encryption started working after the upgrade so I’m confident the problem is Windows 10.

パスキー暗号化は、どのブラウザを使用しても Windows 10 では機能しないことがわかりました。
Windows11にしたら機能した

You are referring to a blog post from last June. Webauthn PRF support was added to Chrome in version 116 which went stable after the article was published.

ChromeはVersion116からPRFサポートされた

FYI, this thread alone has confirmed that Chrome, Edge, and Brave are PRF-capable, and it has been reported that all Chromium based browsers are PRF-capable (which would include Opera, Vivaldi, and others, in addition to the ones just mentioned).

すべてのChromiumベースのブラウザがPRF対応していることは報告されている

Bitwarden uses a randomly generated 256-bit symmetric encryption key for encryption and decryption of your vault.

Bitwarden は、保管庫の暗号化と復号化にランダムに生成された 256 ビットの対称暗号化キーを使用する。

In a brute-force attack, an attacker would need to correctly guess either your master password or your PRF public key. Since the PRF is a 32-byte random number, its entropy is 256 bits. To get an equivalent master password entropy, it would need to be a randomly generated passphrase containing twenty words.

ブルートフォース攻撃では、攻撃者はPRF公開鍵を正しく推測する必要がある。PRFは32バイトの乱数でエントロピーは256ビット。

This is going to involve a passkey stored in Apple’s iCloud keychain and so you will not be able to do this (as of Feb 2024). The issue is iCloud keychain will store a passkey but will not support PRF so no encryption.

iCloudキーチェーンはパスキーを保存するが、PRFはサポートしていないと。(2024年2月時点で)

Basically what I am getting here, is there is no way to set up a passkey that can unlock my vault without a Yubikey? Pretty lame that apple biometrics can’t be used.

対応しているOSを使っている場合は、パスキーを携帯電話に保存して認証のためにPCに送信することができる。逆に言うと、その方法でしかできなさそう。

But the user (Teghan) requires a passkey with encryption. Does your method include encryption?
e.g. iPhone (iCloud keychain) passkeys do not.

Androidに保存されたパスキーはgoogle password managerに暗号化されて保存されている。

yes , i was also wondering about the same. But Microsoft may not ever release an update supporting this feature since windows 10 is supposed to have end of life support by 2025.So chances of this being supported feels lot less.

Windows 10 は 2025 年までにサポートが終了する予定なので、PRFに対応するアップデートをリリースしない可能性が高い。

taizo-taizo-

WebAuthnとは?

こちらのサイトに詳しく乗っている
https://engineering.mercari.com/blog/entry/2019-06-04-120000/

WebAuthnは、パスワードレス認証を可能にするための仕組み(API)です。このAPIは、パスワードなどのクレデンシャルを取得/保存する機能をウェブサイトの開発者に提供するCredential Management APIの拡張として策定されています。

ID/パスワードの代わりに、公開鍵/秘密鍵の組み合わせを利用して認証を行います

  • ブラウザは認証器とのやり取りも発生するので、Web Authentication API をサポートされている状態である必要がある
  • ブラウザから認証器に対してチャレンジを投げるときに、CTAP2 (Client To Authenticator Protocol 2.0)というプロトコルを利用して通信する。そこで必要な認証情報を提供してもらう
taizo-taizo-

ソルトの生成方法は?

Bitwardenの実装を参考にする。
https://github.com/bitwarden/clients/blob/main/libs/common/src/auth/services/webauthn-login/webauthn-login-prf-key.service.ts#L9

ソルトの生成プロセス

  1. 任意の固定文字列を定義する
  2. その文字列をUTF-8エンコードして、バイト列に変換する
  3. SHA-256でハッシュ化して、ArrayBufferとして使用する

ソルトの目的

  • セキュリティの向上
    • PRFの入力値を予測困難にする
    • 同じパスキーでも異なるソルトを使用することで、異なる出力結果が得られる
taizo-taizo-

暗号化処理に出てくるバイト列について

  • 暗号処理は基本的にバイト単位で行われる
  • 文字列の抽象的な表現ではなく、具体的なバイトデータが必要

なぜバイト列なの?

  • コンピュータの基本的なデータ処理単位との整合性が取れる
    • 1バイト = 8ビット
  • 暗号アルゴリズムとの親和性
    • AES: 128ビット(16バイト)ブロック
    • SHA-256: 512ビット(64バイト)ブロック
    • RSA: バイト列として処理

バイト単位での処理は、ハードウェアの特性と暗号アルゴリズムの要件の両方に適合した効率的な方法になっている

Hidden comment