Web Cryptography APIの鍵管理について調べてみた

はじめに

Web Cryptography APIについて気になったので触ってみました。 www.w3.org

また、Web Cryptography APIは鍵の生成、インポート、エクスポートができるようなので鍵管理についても調べてみました。
ブラウザ上での鍵管理が安全かつ容易にできるようになればトークンをベースとした認証の利用シーンが増えるのではないかという個人的な期待もあります。

サンプル

とりあえず動かしてみます。
W3Cのドキュメント内にサンプルコードがあるので参考にできそうです。 www.w3.org

また、用途ごとに細かくサンプルコードを分けて用意してくれているリポジトリがありました。こちらも参考になりました。(更新が止まっているようにも見えるので注意が必要) github.com

各メソッドはSubtleCrypto interfaceに定義されています。

Key Strageについて

Key Strageについては以下のように記載されています。

This specification does not explicitly provide any new storage mechanisms for CryptoKey objects. https://www.w3.org/TR/WebCryptoAPI/#concepts-key-storage

どうやら鍵管理用のストレージを提供している訳ではなさそうです。つまりブラウザから利用できる既存の保存領域を利用することになるのでしょうか。
また、以下のような記載がありました。

In practice, it is expected that most authors will make use of the Indexed Database API, which allows associative storage of key/value pairs, where the key is some string identifier meaningful to the application, and the value is a CryptoKey object. https://www.w3.org/TR/WebCryptoAPI/#concepts-key-storage

鍵の保存に関してIndexed Database APIの利用が例としてあげられています。
ここでIndexed Databaseが鍵の保存領域として問題ないのかが気になってきます。
調べてみた結果、Indexed Databaseでの鍵管理について、Indexed Databaseに鍵を保存して問題ない明確な答えは見つけられませんでした。
以下のように同様の質問は投稿されていましたが、解決には至っていませんでした。 t.co

stackoverflow.com

鍵のエクスポートについて

CryptoKey interfaceにはextractableという値が定義されており、generateKeyメソッドなどで指定ができます。

このextractableについては以下のように説明されています。

While access to the underlying cryptographic key material may be restricted, based upon the extractable attribute, once a key is shared with a destination origin, the source origin can not later restrict or revoke access to the key.

Export Keyメソッドの挙動としては以下の通りです。もし、extractablefalseの場合にエクスポートしようとするとInvalidAccessErrorになるようです。

If the extractable internal slot of key is false, then throw an InvalidAccessError. https://www.w3.org/TR/WebCryptoAPI/#SubtleCrypto-method-exportKey

つまりextractableの指定によりexportKeyメソッドを経由した鍵の取得は制限できるようです。

おわりに

Web Cryptography APIを触ってみて、Key Strageについて少し調べてみました。
一度エクスポートした鍵の管理や、exportKeyメソッド以外から鍵にアクセスできないのか、など不明な点がまだまだ残りました。

参考