暗号化
Anon は各所で現代的な監査済みの暗号プリミティブを使います。このページでは対象、方法、保存場所を説明します。
保存時の暗号化(IndexedDB)
ニーモニックと機密性の高いアカウントデータは、AES-256-GCM で暗号化してブラウザーの IndexedDB に保存します。
- AES-256-GCM は機密性と完全性を備えた認証付き暗号で、改ざんを検出します
- 暗号化鍵は
CryptoKeyで、chrome.storage.localに抽出不可の形で保存され、パスキーやパスワードから導出した鍵で暗号化されます - IV(初期化ベクトル)は暗号化のたびにランダム生成します
保存時の暗号化フロー
Passkey PRF output
│
HKDF (SHA-256)
│
Storage wrap key
│
Encrypts CryptoKey ──→ chrome.storage.local
│
CryptoKey (AES-256-GCM)
│
Encrypts mnemonic ──→ IndexedDB
メモリ内の鍵
次の鍵はメモリだけに存在し、永続化されません。
| 鍵 | 用途 | 保持期間 |
|---|---|---|
| PRF 鍵 | ルート導出の入力 | 認証中のみ、数秒程度 |
| Railgun 鍵 | 残高の復号、zk-SNARK 証明、取引署名 | ロックまでのセッション |
| IDB CryptoKey(復号済み) | IndexedDB の暗号化と復号 | セッション |
Anon のロック時にメモリから消去します。
HKDF による鍵導出
HKDF(HMAC ベースの鍵導出関数、RFC 5869)は、単一のルートシークレットから独立した複数の鍵を生成します。
PRF output (32 bytes)
│
├── HKDF("anon:railgun:full:v1") ──→ Railgun key (viewing + spending)
└── HKDF("anon:secrets:indexeddb:v1") ──→ IDB CryptoKey (AES-GCM wrap key)
各導出では永続的なマスターソルトと固有の info ラベルでドメインを分離します。HKDF により、一つの導出鍵が漏れても他の導出鍵は漏れません。
Railgun ノートの暗号化
Railgun では、支出可能な残高のコミットメントである各ノートを受信者の公開鍵でハイブリッド暗号化します。
- ECDH 鍵合意で共有シークレットを導出
- AES-256-GCM でノート内容を暗号化
Anon は Railgun 鍵を使い、ローカルでノートを復号します。
暗号化しないデータ
次の情報は本来公開されるため、平文で保存します。
- 公開 Ethereum アドレス
- ネットワークの RPC URL
- 接続済み DApp の一覧(ホスト名のみ)
- 拡張機能の設定(テーマ、タイムアウトなど)