Web Crypto API とは?
Web Crypto API は、暗号化、復号、鍵生成、ハッシュ化、署名などの暗号プリミティブのスイートへの JavaScript インターフェースを提供する W3C 標準で、ブラウザにネイティブ実装されています。
Web Crypto API が登場する以前、暗号化が必要なウェブアプリケーションはアルゴリズムをゼロから実装した JavaScript ライブラリに頼らざるを得ませんでした。これらのライブラリは遅く(JavaScript インタープリターで動作するため)、タイミング攻撃に脆弱な可能性があり、最新の CPU が持つハードウェア暗号アクセラレーターを活用できませんでした。
Web Crypto API はこれらの問題を、ブラウザのネイティブ暗号エンジンを JavaScript に公開することで解決します。AES 暗号化、鍵生成、PBKDF2 鍵導出などの操作は、コンパイルされたネイティブコードとして実行され、最新プロセッサの AES-NI 命令によるハードウェアアクセラレーションと、タイミングサイドチャネルへの耐性を持つ定数時間実装の恩恵を受けます。
API は非同期設計になっており、すべての操作はメインスレッドをブロックするのではなく Promise を返します。API によって作成された CryptoKey オブジェクトはデフォルトで不透明であり、明示的にエクスポート可能とマークされない限りメモリから取り出すことができません。これにより、誤った鍵漏洩に対する追加の保護層が提供されます。
Vaulted における Web Crypto API の使われ方
Vaulted はすべての暗号化操作に Web Crypto API のみを使用しています。AES-256-GCM 鍵の作成には crypto.subtle.generateKey を、実際の暗号化には crypto.subtle.encrypt と decrypt を、パスフレーズ使用時の鍵導出には PBKDF2 を用いた crypto.subtle.deriveKey を使用します。ブラウザネイティブの暗号化のみに依存することで、Vaulted はサードパーティの暗号ライブラリへの依存を避け、ハードウェアアクセラレーションされた定数時間実装の恩恵を受けています。