Kaspa Desk хранит весь ваш профиль — ключи HD-кошелька, ссылки на хранилища Safe, сделки Escrow, идентификаторы Arena — внутри единого зашифрованного блоба в вашем браузере. Этот блоб запечатан с помощью формата шифрования age, разблокируется только при вводе пароля и стирается из памяти в момент блокировки сессии или закрытия вкладки. В этой статье подробно описано, как это работает, где находятся границы и какие компромиссы принимает браузерный кошелек по сравнению с аппаратными или нативными решениями ОС.
Проблема: секреты во враждебной среде выполнения
Браузер — не безопасная среда. Расширения могут читать DOM. Ошибка межсайтового скриптинга в любом скрипте на странице может выполнить произвольный JavaScript. Другие вкладки разделяют один и тот же процесс в некоторых браузерах. Буфер обмена читается любым активным приложением. И все же миллионы пользователей хранят крипто-ключи в браузерных кошельках — потому что альтернатива (запуск полного узла, ручная компиляция транзакций) непрактична для ежедневного использования.
Инженерный вопрос звучит не «безопасен ли браузер так же, как аппаратный кошелек?» — это не так — а скорее: *поскольку мы находимся в браузере, как мы можем минимизировать окно, в течение которого ключевой материал раскрыт, и как мы можем защитить его, когда пользователь не подписывает активно?*
Kaspa Desk отвечает на это тремя уровнями: шифрование в покое (зашифрованный в формате age файл профиля), ограничение сессии (защищенный паролем разблокированный доступ в памяти) и явное обнуление (очистка временных буферов ключей после каждой криптографической операции).
Как шифрование age защищает профиль в покое
age — это современный инструмент и формат шифрования файлов, созданный Филиппо Вальсорда. Он использует обмен ключами X25519 и аутентифицированное шифрование ChaCha20-Poly1305. Формат намеренно прост: текстовый заголовок идентифицирует получателя(ей), за которым следует двоичная полезная нагрузка зашифрованных фрагментов. Нет устаревшего RSA, нет PGP-подобной сети доверия, нет серверов ключей. Тип получателя с парольной фразой и scrypt позволяет зашифровать файл только с помощью пароля — именно этот режим использует Kaspa Desk для хранения профиля.
age (формат) — Спецификация шифрования файлов, использующая X25519 + ChaCha20-Poly1305. В режиме парольной фразы пароль пользователя растягивается через scrypt и используется для оборачивания случайного ключа файла. Для расшифровки требуется тот же пароль; нет ни черного хода, ни хранения ключей третьей стороной.
Когда вы создаете профиль Kaspa Desk, браузер генерирует HD-сид (стиль деривации BIP-32/BIP-44 для адресов Kaspa), ваши ссылки на Safe, состояние Escrow, канарейные наборы ключей Arena и все метаданные. Весь этот объект сериализуется и шифруется с помощью age в режиме парольной фразы. Шифротекст записывается в локальное хранилище браузера (IndexedDB). Никакие ключи, сиды или адреса в открытом виде не сохраняются.
При экспорте резервной копии Desk создает файл .age — тот же самый зашифрованный в формате age блоб, который вы можете хранить на USB-накопителе, в менеджере паролей или на изолированной от сети машине. Поскольку age — это опубликованный, проверяемый формат с эталонными реализациями на Go и Rust, вы не привязаны к инструментарию Kaspa Forge для его расшифровки. Любой клиент age с вашим паролем может восстановить файл.
Импорт и слияние работают в обратном порядке: Desk читает файл .age, расшифровывает его с помощью предоставленного пароля и объединяет восстановленный профиль с текущим состоянием устройства — согласовывая историю UTXO, индексы адресов и ссылки Safe/Escrow без перезаписи более новых локальных данных, если вы не подтвердите.
Границы сессии: блокировка, разблокировка и парольный шлюз
Расшифровка профиля помещает ключевой материал в память JavaScript. С этого момента и до блокировки или закрытия вкладки Desk может выводить адреса, проверять балансы и просматривать ваши Safe и сделки Escrow, не запрашивая пароль снова для операций только чтения. Опрос баланса от узла Kaspa работает автоматически, пока видна вкладка Обзор или Кошелек, и немедленно останавливается при блокировке.
Операции записи — отправка KAS, вход в комнату Arena, публикация на Boards — запрашивают пароль повторно. Граница подписи Arena — самый явный пример: completeArenaJoin вызывает confirmPassword перед тем, как вызвать модуль WASM только для подписи, подписать транзакцию входа в комнату и немедленно обнулить временный Uint8Array, содержащий производный ключ. Подписанный конверт отправляется контроллеру Arena; исходный ключ никогда не покидает браузер, и контроллер никогда его не видит.
Блокировка сессии (доступная из меню утилит Desk наряду с Экспортом, Импортом и Стиранием с устройства) выполняет три действия:
1. Очищает весь ключевой материал в памяти — HD-сид, производные приватные ключи и любое кэшированное состояние подписи. 2. Сохраняет зашифрованный блоб в IndexedDB — ваш профиль по-прежнему на диске, просто нечитаем без пароля. 3. Аннулирует любые активные опросы — обновления баланса, проверки статуса Escrow и обновления лобби Arena немедленно останавливаются.
После блокировки следующий переход на любую страницу Desk вызывает запрос пароля. Нет переключателя «запомнить меня», который бы ослаблял это — дизайн намеренно неудобен для атакующего, получившего кратковременный доступ к разблокированной вкладке браузера.
Более узкое окно Arena
Игровой процесс Arena вводит специальную передачу сессии. Когда вы садитесь за стол и контроллер принимает ваше место, Desk записывает короткоживущий токен в sessionStorage, содержащий roomId, gameId и 10-минутный дедлайн. Этот токен используется ровно один раз на странице игрового стола, а затем удаляется. После использования игровая сессия живет только в памяти на протяжении этой раздачи. Hit, Stand или выход из стола не продлевают ее. Если вы уйдете со страницы или истекут 10 минут, передача исчезнет, и подписант откажется производить дальнейшие ходы без новой церемонии.
Это намеренное сужение: даже в рамках аутентифицированной сессии Desk ключи игры Arena ограничены одной раздачей и одной комнатой.
Обнуление и что оно защищает (а что нет)
После каждой операции подписи Desk обнуляет буферы Uint8Array, содержащие байты приватного ключа. В JavaScript это означает запись нулей поверх резервной памяти типизированного массива и освобождение ссылки. Это не эквивалентно SecureZeroMemory в C — сборщик мусора V8 мог скопировать байты в другую область кучи, а операционная система могла выгрузить память процесса на диск. Обнуление сокращает *практическое* окно, в течение которого расширение для сканирования памяти или атака с холодным пуском могут извлечь ключи, но не устраняет эти векторы.
Это фундаментальный компромисс любого браузерного кошелька: вы доверяете среде выполнения JavaScript, изоляции процессов браузера и отсутствию вредоносных расширений. Дизайн Kaspa Desk минимизирует раскрытие — ключи расшифровываются только по требованию, повторно ограничиваются паролем для каждого действия подписи и обнуляются после этого — но он не может обеспечить гарантии выделенного безопасного элемента.
Kaspa Desk работает на /desk. Ваши ключи никогда не покидают ваше устройство — зашифрованный профиль, блокировка сессии и подписание, ограниченное паролем, полностью клиентские. Если вы хотите максимально возможной изоляции, объедините Desk с ковенант-хранилищами Kaspa Safe: даже если ваша сессия браузера скомпрометирована, хранилище с тайм-локом и отдельным ключом тревоги дает вам ончейн-окно для отмены кражи до истечения задержки.
Как продукты Kaspa Forge зависят от этого слоя
Каждая поверхность Kaspa Forge, касающаяся ценностей, проходит через модель шифрования и сессий Desk:
- Kaspa Safe — Создание или пополнение Safe из Desk расшифровывает HD-ключ для подписи транзакции генезиса ковенанта. Сам ковенант находится в блокчейне и переживает любую компрометацию браузера; шифрование Desk защищает момент *настройки*.
- Kaspa Escrow — Пополнение сделки и выпуск требуют подписей кошелька. Контракт Escrow хранит KAS в блокчейне, но сессии Desk покупателя и продавца должны быть разблокированы для авторизации каждого шага.
- Deposit — Залог ковенанта блокируется в блокчейне, но первоначальный депозит и любое заявление о споре требуют подписи Desk за парольным шлюзом.
- Marketplace — Создание листинга — действие на стороне Desk; сам листинг — это публичный URL. Покупка проходит через Escrow, наследуя его требования к сессии.
- Boards — Каждый пост подписывается текущим HD-адресом. Desk переключается на следующий адрес
wallet/<index>после каждой трансляции, атомарно фиксируя новый ключ в зашифрованном профиле до того, как транзакция достигнет узла. Расчет комиссии используетnormalfeerate узла через ту же модель массы WASM, которая питает отправки кошелька. - Arena — Самая жесткая модель сессии: повторный ввод пароля при каждом входе, 10-минутное окно передачи, обнуление ключа после каждой подписи хода игры. Arena Blackjack — публичная бета-версия основной сети. Инженерная работа над Dice имеет свой постоянный производственный филиал, ожидающий независимой проверки. Duel и Baccarat — идеи из дорожной карты, а не продукты.
Компромиссы и честные ограничения
Что дает шифрование age в браузере:
- Сильное шифрование на основе парольной фразы в покое (scrypt + X25519 + ChaCha20-Poly1305).
- Портативный, проверяемый формат резервного копирования (
.age), не зависящий от серверов Kaspa Forge. - Ограничение на уровне сессии: пароль требуется для каждого действия подписи, а не только для первоначальной разблокировки.
- Немедленное обнуление ключа после использования, сужающее окно раскрытия памяти.
Что оно не дает:
- Защиту от скомпрометированного браузера или вредоносного расширения. Если произвольный JavaScript может выполняться в источнике Desk, он может перехватить запрос пароля, прочитать расшифрованную память или экспортировать подписанные транзакции. Ни одна клиентская схема шифрования не может полностью защитить от враждебной среды выполнения.
- Защиту от криминалистики памяти на уровне ОС. Куча JavaScript не закреплена, не зашифрована в оперативной памяти и может быть выгружена на диск. Атака с холодным пуском или дамп памяти процесса могут восстановить ключевой материал между разблокировкой и блокировкой.
- Защиту от подглядывания через плечо или кейлоггинга. Пароль вводится в поле ввода браузера. Аппаратный кейлоггер или расширение для записи экрана захватывают его без труда.
- Прямую секретность для блоба профиля. Если атакующий скопирует ваш IndexedDB, пока сессия разблокирована, а позже получит ваш пароль (или наоборот), он сможет расшифровать весь профиль. Шифрование age — это защита в покое, а не изоляция при передаче или использовании.
Это не специфические слабости Kaspa — они присущи модели безопасности браузера. Честный путь смягчения для хранения крупных сумм — объединить Desk с ончейн-ковенант защитой, такой как Kaspa Safe, где тайм-лок на вывод и отдельный ключ тревоги дают вам ончейн-аварийный люк, работающий независимо от целостности вашего браузера. Модель транзакций Kaspa, построенная на UTXO и проверяемая по правилам консенсуса GHOSTDAG, означает, что обеспечение ковенанта происходит на уровне протокола — никакая компрометация браузера не может обойти тайм-лок, который сам узел Kaspa проверяет.
FAQ
Какой формат шифрования использует Kaspa Desk для моего кошелька?
Desk использует формат шифрования файлов age в режиме парольной фразы — обмен ключами X25519 с аутентифицированным шифрованием ChaCha20-Poly1305 и scrypt для растяжки пароля.
Где хранится мой зашифрованный профиль?
В IndexedDB вашего браузера, на вашем локальном устройстве. Серверы Kaspa Forge никогда не получают ваши ключи, сид или пароль.
Могу ли я расшифровать резервную копию Desk без Kaspa Forge?
Да. Экспорт .age — это стандартный файл, зашифрованный в формате age. Любой официальный клиент age (реализация на Go или Rust) может расшифровать его с помощью вашего пароля.
Блокировка Desk удаляет мой кошелек?
Нет. Блокировка очищает ключевой материал в памяти и останавливает все опросы, но зашифрованный профиль остается в IndexedDB. Вы можете снова разблокировать его с помощью пароля. «Стереть с устройства» — это отдельное действие, которое удаляет локальные данные.
Безопасен ли браузерный кошелек для крупных сумм?
Браузерные кошельки принимают компромиссы, связанные с изоляцией среды выполнения. Для значительных средств используйте Desk вместе с ончейн-ковенант хранилищами, такими как Kaspa Safe, которые обеспечивают задержку вывода, независимую от безопасности вашего браузера.
Что происходит с моими ключами во время игры Arena?
Desk запрашивает ваш пароль повторно перед каждым входом в Arena, подписывает транзакцию внутри модуля WASM только для подписи и немедленно обнуляет временный буфер ключа. Передача сессии игры имеет 10-минутный срок действия и используется однократно.
Держите KAS там, где кражу можно отменить
Ковенант-сейф в мейннете Kaspa: ваши ключи, ваши правила, наш инструмент. Ончейн — бесплатно, навсегда.
Создать сейф