Шифрование
Anon использует современные проверенные аудитом криптографические примитивы. Здесь описано, какие данные шифруются, как и где.
Шифрование хранения (IndexedDB)
Мнемоническая фраза и другие чувствительные данные аккаунта хранятся в браузерной IndexedDB, зашифрованные AES-256-GCM:
- 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
- URL сетевых RPC
- Список подключённых DApp, только имена хостов
- Настройки расширения: тема, время сеанса