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
鍵のエクスポートについて
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メソッドの挙動としては以下の通りです。もし、extractable
がfalse
の場合にエクスポートしようとすると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メソッド以外から鍵にアクセスできないのか、など不明な点がまだまだ残りました。