鍵の管理
Anonは、機密の鍵情報を平文でディスクに保存せず、各操作で必要最小限の鍵権限だけを使うよう設計された、階層型の鍵アーキテクチャを使用します。
鍵の階層
Device authenticator (passkey / password)
│
▼
Root secret ← PRF / Argon2id; session memory
│
HKDF derivation
/ \
/ \
Railgun IDB CryptoKey
key (AES-GCM)
PRF鍵(ルート)
パスキーで認証すると、認証器が疑似乱数関数(PRF)を提供し、パスキーの認証情報に紐づいた決定的な秘密値を出力します。保存や同期の方式は認証器によって異なります。このPRF出力が鍵の階層のルートになります。ディスクには書き込まれず、セッション中のメモリにのみ存在します。
パスワードで認証する場合、Argon2idがパスワードと保存済みのソルトから同じ役割を持つルート秘密値を導出します。
HKDFによる導出
Anonは、PRF鍵からHKDF(HMACベースの鍵導出関数)を使って2つの鍵を導出します。
- Railgun鍵(
anon:railgun:full:v1)— 残高の復号(閲覧)とzk-SNARK証明の生成(支出)の両方に使う単一の鍵です。認証時に読み込まれ、セッション中はメモリに保持されます。 - IDB CryptoKey(
anon:secrets:indexeddb:v1)— IndexedDB内の機密データ(ニーモニック、アカウント情報)を暗号化・復号するAES-256-GCM鍵です。認証時に読み込まれ、セッション中はメモリに保持されます。
KeyVault(メモリ内キャッシュ)
KeyVaultは、セッションで使用中の鍵を保持するメモリ内のシングルトンです。次の特性があります。
- 認証に成功すると鍵が格納されます
- ディスクに書き込まれません
- ログアウトまたはウィンドウを閉じると自動的に削除されます
- 支出鍵を必要としないバックグラウンドページのアクセスパターンから保護されます
データの保存先
| データ | 保存先 | 暗号化 |
|---|---|---|
| 暗号化されたニーモニック | IndexedDB | IDB CryptoKeyによるAES-GCM |
| IDB CryptoKey | Chromeストレージ | PRFから導出した鍵で暗号化 |
| 公開アドレス | Chromeストレージ | 平文(もともと公開情報) |
| Railgun鍵 | メモリのみ | 永続化しない |
| IDB CryptoKey(復号済み) | メモリのみ | 永続化しない |
| PRF鍵 | メモリのみ | 永続化しない |
復元
デバイスにアクセスできなくなった場合は、12語のニーモニックフレーズでウォレットを復元できます。ニーモニックからすべての鍵を再生成します。オフラインの安全な場所で保管してください。