Open9

1PasswordのPasskeyによるデータ暗号化を理解したい

fujiwofujiwo

While passkeys are a great sign-in method, they can’t be used to encrypt the data associated with your account. Until now, services have been stuck with passwords and other clever key handling methods to encrypt customer data.

That’s no longer the case for services that you’ve chosen to protect with a passkey saved in 1Password. Starting with the latest beta versions of our browser extension and 1Password for Android, any service you log in to with a passkey – provided it’s stored in 1Password – can use that same passkey for end-to-end encryption.

ログインに利用したPasskeyだけあれば、クライアント側だけでデータの暗号化と復号化ができるっぽい?

fujiwofujiwo

Let’s say you use an app that protects all of your notes with end-to-end encryption. That means only you have the key required to decrypt and read your notes. Historically this key would be a password. It would be used to verify who you are and decrypt your data.

Passkeys in their base form can only be used to verify who you are. They’re excellent at this but can’t traditionally be used to scramble the data associated with your account – in this case, your private notes.

That changes with the Pseudo-Random Function (PRF) extension. Now, passkeys stored in 1Password can also be used for encryption. That means the note-taking app can fully ditch passwords and use passkeys for the sign-in process and encrypting your notes.

メモを暗号化して保護してくれるアプリを例に説明してくれている。
通常はユーザが入力するパスワードなどの秘密情報を使って暗号化するよねと。

Passkeyはユーザが誰であるかを識別するために利用されるわけで、Passkey自体を暗号化には使えなかった。
ただPRFという拡張機能ができたのでその状況は変わったと。つまりPasskeyのみでユーザの識別からデータの暗号化までできるようになったらしい。

fujiwofujiwo

Pseudo-Random Function, or PRF, is an extension for WebAuthn, the protocol behind passkeys. Along with the basic functionality for passkeys, the WebAuthn specification includes optional extensions that add useful features.

You might already know that behind every passkey are a public and private key. PRF creates an additional key, which doesn’t encrypt your data directly. Instead, the extension combines this third key with a salt which is generated by the service (e.g. the note taking app). Mixing these two ingredients in a secure way produces a shared secret in addition to the usual passkey authentication result. The service can then use this shared secret as an encryption key.

  • PRFはWebAuthn APIの拡張機能
  • Passkey生成時に公開鍵、秘密鍵に加えてもう一つ追加でキーを作成する
  • この「追加で生成されたキー」+「サービス側で生成したsalt」をあわせて「共有シークレット」を作成
  • 「共有シークレット」はデータの暗号化に利用できる

Shared Secretの特徴

This shared secret has two important properties:

Its value is deterministic. The same input from the web service will always give the same respective output.
Its value is unpredictable. It is virtually impossible for an attacker to guess the shared secret or the passkey’s secret even if they know many of the possible salt and shared secret combinations.

fujiwofujiwo

ちょいと飛ばして

We’re running a public beta at the moment that lets you unlock 1Password with a passkey instead of an account password and a secret key. When you unlock 1Password this way, we currently generate and store a separate device key that is used to decrypt and encrypt your account data.

When other websites or apps implement end-to-end encryption, they now need to carefully think about where and how they should store the encryption keys. Every platform requires a different implementation and in the browser it’s currently not possible to store these keys in a secure manner.

By supporting the PRF extension for passkeys, encryption keys are now protected by the same mechanisms that already secure millions of passkeys. This finally allows passkeys to truly replace passwords for any operation.

現在、アカウント パスワードとシークレット キーの代わりにパスキーを使用して 1Password のロックを解除できるパブリック ベータ版を実行しています。この方法で 1Password のロックを解除すると、アカウント データの暗号化と復号化に使用される別のデバイス キーが生成され、保存されます。

他の Web サイトやアプリがエンドツーエンドの暗号化を実装する場合、暗号化キーをどこにどのように保存するかを慎重に検討する必要があります。プラットフォームごとに異なる実装が必要であり、ブラウザーでは現在、これらのキーを安全な方法で保存することはできません。

パスキーの PRF 拡張機能をサポートすることで、暗号化キーは、すでに何百万ものパスキーを保護しているのと同じメカニズムによって保護されるようになりました。これにより、パスキーは最終的に、あらゆる操作でパスワードの代わりに使用できるようになります。

なるほど、Passkeyと同じ保護領域に新たにPRFを使ってキーを作ってるっぽい。
それを元に暗号化用のキーが作れるので、Passekeyのみでエンドツーエンドな暗号化を実現できたと。

fujiwofujiwo

In an ideal world, every passkey manager would support PRF. It would allow other companies to make their services more secure by implementing end-to-end encryption, knowing that the key is securely protected.

As an end-to-end encrypted product, 1Password would also greatly benefit. If you unlock 1Password with a passkey, this would give you the option to let 1Password handle the encryption key or to store the encryption key in another passkey manager. It’s a win-win for everyone!

Unfortunately, this is not the world we live in today. We want to see every passkey manager adopt the PRF extension. This will allow applications and web services to encrypt their user’s data when they adopt passkeys. Therefore, we are leading the charge by providing our PRF implementation in our open-source passkey library. This makes it easier for other passkey managers to provide PRF for their users.

認証器(パスキーマネージャー)が将来的にPRFに対応できるといいなと考えているっぽい。
そのためにパスキーマネージャーにprf拡張を組み込むためのライブラリをOSSで出していると。

fujiwofujiwo

Web Authn API

利用方法

// 認証器に対して認証情報作成を依頼
navigator.credentials.create()

// 認証器に登録された認証情報を取得し、検証
navigator.credentials.get()

拡張機能

https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API/WebAuthn_extensions

  • create、getの処理中に特定の処理を差し込むことができるらしい
  • いくつか提供されている拡張機能がある
fujiwofujiwo

PRF

  • 疑似乱数関数
  • 入力に対して、ランダムに見える出力を生成する関数
  • 同じ入力に対して常に同じ出力
  • 暗号学的に安全であり、出力を予測することは困難
  • 鍵導出関数(マスターキーなどの値から鍵を生成する仕組み)の内部で使われる
    • つまり暗号化キーを作るシードの役割か
fujiwofujiwo

PRFを使った暗号化

1Passwordの記事の下部に参考としてリンクがあった。
Encrypting Data in the Browser Using WebAuthn

ざっくりメモ

navigator.credentials.create()実行時(認証情報作成時)

  • 公開鍵、秘密鍵に加えて、PRFで利用するためのキーを生成

navigator.credentials.get()実行時(認証時)

  • 「先ほど作成したキー」 + 「Service側から提供されたSalt」を入力としてPRFを実行し、乱数を作成
  • 乱数を元に、暗号化キーを作成