SHA256
167 lines
13 KiB
Markdown
167 lines
13 KiB
Markdown
# Ключи SHiNE
|
|
|
|
Этот документ описывает роли ключей в SHiNE и их связь с Solana, персональным блокчейном, личными сообщениями, сессиями и будущими аппаратными устройствами.
|
|
|
|
Документ является архитектурной справкой. Он не меняет текущие форматы API, DM-блоков или блокчейна сам по себе.
|
|
|
|
## Коротко
|
|
|
|
В SHiNE у пользователя есть несколько уровней ключей:
|
|
|
|
- `root key` / **ключ восстановления** - recovery-authority. Его приватная часть не хранится на устройствах и временно выводится из пароля только для операций, где нужна по текущему протоколу. Это не кошелёк.
|
|
- `blockchain key` / **ключ блокчейна** - постоянно хранимый рабочий ключ записи в персональный SHiNE-блокчейн и канонический источник пользовательских кошельков (Solana, Arweave SAWD-v1, Turbo через Solana).
|
|
- `client key` / **ключ доступа** - постоянно хранимый рабочий ключ для входа на сервер, устройства, звонков и DM. Кошельки из него не выводятся.
|
|
- `session key` - ключ конкретной сессии или конкретного устройства для авторизации на сервере.
|
|
|
|
В текущем релизе обычное авторизованное устройство автоматически хранит два рабочих ключа: `blockchain key` и `client key`. Ограниченного режима пока нет. Приватный `root key` не сохраняется и не передаётся между устройствами.
|
|
|
|
## `root key`
|
|
|
|
`root key` - ключ восстановления пользователя. Его приватная часть не является постоянно сохранённым ключом устройства.
|
|
|
|
Назначение:
|
|
|
|
- холодное recovery-разрешение для полной смены ключей;
|
|
- подтверждение атомарной ротации `root + client + новый blockchain fork`;
|
|
- восстановительные сценарии повышенного уровня доверия.
|
|
|
|
Обычные PDA-update **не требуют root key**: их выполняет активный blockchain key. При полной ротации старый root подписывает тот же hash нового unsigned PDA state, который подписывает новый blockchain key. Так root разрешает переход, не становясь повседневным ключом.
|
|
|
|
Важно не путать recovery-authority и кошелёк: `root key` не является fee payer. Его публичная часть хранится в PDA, а приватная часть в текущем UI выводится из пароля только на время защищённой операции и затем не сохраняется. Текущий Solana-wallet/fee payer — активный `blockchain key`. Подробнее — `docs/Keys/DERIVATION.md`, §3.
|
|
|
|
## `blockchain key`
|
|
|
|
`blockchain key` - ключ записи в персональный SHiNE-блокчейн пользователя.
|
|
|
|
Назначение:
|
|
|
|
- подпись записей в персональном блокчейне пользователя;
|
|
- подтверждение действий, которые должны попасть в SHiNE-блокчейн;
|
|
- обычные обновления пользовательской PDA;
|
|
- текущий Solana-wallet/fee payer (`base58(active blockchain public key)`);
|
|
- источник штатного Arweave SAWD-v1 wallet;
|
|
- ключ Solana-кошелька, которым пополняется Turbo.
|
|
|
|
У пользователя может быть несколько персональных блокчейнов или веток. При смене `blockchain key` фактически создаётся новая ветка записи:
|
|
|
|
- `username-001` - первая ветка;
|
|
- `username-002` - вторая ветка;
|
|
- `username-003` - третья ветка.
|
|
|
|
Номер fork ограничен диапазоном `001..999`; после `username-999` новая ротация blockchain key не создаётся.
|
|
|
|
Рабочая логика по умолчанию должна использовать последнюю актуальную ветку. Старые ветки остаются читаемыми и показывают историю смены ключей.
|
|
|
|
## `client key`
|
|
|
|
`client key` - общий ключ, который знают доверенные устройства пользователя.
|
|
|
|
Назначение:
|
|
|
|
- повседневные входящие и исходящие личные сообщения;
|
|
- звонки и связанные с ними сообщения;
|
|
- self-messages, то есть внутренние сообщения пользователя самому себе.
|
|
|
|
Штатные кошельки из `client key` не выводятся. Arweave SAWD-v1 использует `blockchain key`: `docs/Протоколы/SHINE_ARWEAVE_DERIVATION_V1.md`.
|
|
|
|
## `session key`
|
|
|
|
`session key` - уникальный ключ конкретной сессии или устройства.
|
|
|
|
Возможные форматы:
|
|
|
|
- `Ed25519` - предпочтительный современный вариант;
|
|
- `RSA` - legacy-вариант, полезный для устройств, где системное защищённое хранилище хорошо поддерживает RSA-ключи и не позволяет извлекать приватный ключ.
|
|
|
|
Назначение:
|
|
|
|
- авторизация сессии на сервере;
|
|
- привязка устройства к пользователю;
|
|
- подтверждение запросов от конкретной сессии;
|
|
- доступ к локально зашифрованным рабочим ключам (`client key` и `blockchain key`) после успешной авторизации.
|
|
|
|
Одна и та же сессия может быть пригодна для подключения к нескольким серверам пользователя, если архитектура конкретного пользователя это допускает.
|
|
|
|
У сессии должны быть:
|
|
|
|
- имя сессии;
|
|
- тип сессии;
|
|
- публичная часть ключа;
|
|
- ссылка на пользователя;
|
|
- информация о сервере или серверах, которым эта сессия доверена.
|
|
|
|
Имя сессии может создаваться автоматически из названия устройства и короткого случайного идентификатора, например `Android-a1b2c3`, `Ubuntu-f47a90`. Пользователь может переименовать сессию.
|
|
|
|
## Типы сессий
|
|
|
|
Базовые типы:
|
|
|
|
- обычная пользовательская сессия;
|
|
- серверная сессия;
|
|
- аппаратная или доверенная сессия для будущих специализированных сценариев.
|
|
|
|
Обычное авторизованное устройство в текущем релизе имеет:
|
|
|
|
- собственный `session key`;
|
|
- зашифрованный `client key`;
|
|
- зашифрованный `blockchain key`;
|
|
- доступ к DM, блокчейн-действиям и пользовательским кошелькам.
|
|
|
|
Приватный `root key` не хранится даже на обычном доверенном устройстве и не передаётся при подключении другого устройства. Будущий аппаратный режим может расширить эту модель отдельно, но текущий UI такого режима не включает.
|
|
|
|
## Внутренние self-messages
|
|
|
|
Self-message - это сообщение пользователя самому себе.
|
|
|
|
Такие сообщения нужны, чтобы обычное устройство могло попросить доверенное устройство выполнить действие:
|
|
|
|
- подписать запись `blockchain key` и передать её в SHiNE-блокчейн;
|
|
- инициировать защищённую настройку, после чего Recovery key при необходимости должен быть временно выведен из пароля на устройстве пользователя;
|
|
- обновить ключи;
|
|
- сохранить внутреннюю команду или настройку;
|
|
- отправить сообщение другому пользователю с сохранением копии себе;
|
|
- сохранить сообщение только себе.
|
|
|
|
Важно: self-message не является публичной командой сервера. Это пользовательская внутренняя команда, которую сервер или доверенное устройство обрабатывает в рамках прав конкретного пользователя.
|
|
|
|
## Шифрование входящих сообщений
|
|
|
|
Входящее сообщение может быть зашифровано:
|
|
|
|
- `client key`;
|
|
- `session key`;
|
|
- отдельным ключом конкретного чата;
|
|
- другим ключом, который уже известен клиенту.
|
|
|
|
В сообщении не должно быть лишнего раскрытия того, каким именно ключом оно зашифровано. Клиент пробует расшифровать сообщение доступными ключами по порядку. Если расшифровка не удалась, сообщение остаётся непонятным для этого устройства.
|
|
|
|
## Копии сообщений
|
|
|
|
Для отправки сообщений нужны несколько режимов:
|
|
|
|
- сообщение другому пользователю с исходящей копией себе;
|
|
- сообщение другому пользователю без локальной исходящей копии;
|
|
- сообщение только себе.
|
|
|
|
Это должно позволить строить обычные DM, внутренние команды, личные заметки и зашифрованные пользовательские чаты поверх одной общей модели сообщений.
|
|
|
|
## Связанные документы
|
|
|
|
- `docs/Keys/DERIVATION.md` - **источник истины по конкретной деривации** секрета и ключей (формулы Argon2id, `base64|suffix→SHA-256→Ed25519`, суффиксы `root.key`/`blockchain.key`/`client.key`/`homeserver.key:<имя>`, Solana-wallet, ссылки на код).
|
|
- `docs/Personal_Messages/Протокол_DM_v1.md` - текущая логическая документация личных сообщений.
|
|
- `docs/Personal_Messages/Формат_DM_v1.md` - точный байтовый формат личных сообщений.
|
|
- `docs/Blockchain/README.md` - точка входа по форматам SHiNE-блокчейна.
|
|
- `docs/Solana_Architecture/README.md` - архитектура Solana-программ, PDA-счетов, DAO и движения средств.
|
|
- `docs/Инициализация_Solana_регистрации/README.md` - деплой и первичная инициализация Solana-регистрации.
|
|
- `docs/Протоколы/SHINE_ARWEAVE_DERIVATION_V1.md` - derivation Arweave-кошелька из `blockchain key`.
|
|
|
|
## Что нужно уточнить перед реализацией
|
|
|
|
- точный формат записи списка ключей в Solana PDA;
|
|
- как именно обозначать активную ветку персонального блокчейна;
|
|
- какие операции требуют `root key`, а какие достаточно подписывать `blockchain key`;
|
|
- формат self-message-команд;
|
|
- порядок перебора ключей при расшифровке входящих сообщений;
|
|
- правила ротации `client key` и восстановления доступа после потери устройства;
|
|
- какие типы серверных и аппаратных сессий нужны в первой реализации.
|