Ed25519 — кто вы
Долговременный ключ подписи. Публичная часть уходит в приглашение, приватная не покидает устройство.
Безопасность
Сквозное шифрование — это не галочка в интерфейсе, а конкретный конверт, фиксированный порядок проверок и список допущений. Здесь — что проект делает, что видит посредник и где заканчиваются гарантии.
Код приложения и релея открыт: проверять можно не только эту страницу.
Каждое сообщение шифруется отдельным ключом, а тег аутентификации ловит подмену до расшифровки.
На каждое сообщение — новая пара X25519. Два одинаковых текста выглядят как разные наборы байт.
Конверт подписан долговременным ключом отправителя: текст, получатель и время защищены от подмены.
Узел хранит только шифрованные конверты и метаданные. Расшифровать их он не может.
Безопасность — это всегда список того, от кого и от чего мы защищаемся. Вот честная граница.
Провайдер, оператор Wi-Fi или владелец релея видят только шифртекст и служебные поля.
Подпись Ed25519 и идентификатор конверта не дают изменить текст, получателя или время по дороге.
chainLink связывает сообщения в направленную цепочку: вставить или переставить конверт незаметно не получится.
Аккаунтов нет: угнать пароль или почту невозможно, потому что их не существует.
Даже полный дамп узла не раскрывает переписку — ключей получателей там нет.
Кто получил доступ к разблокированному телефону или к файлам приложения, видит ключи и переписку.
Релей и сеть видят, кто, когда и сколько отправил. Это не скрывается, а минимизируется.
Собеседник читает сообщение легально. Скриншот или пересылка — уже вне зоны шифрования.
Если злоумышленник подменит ключи в приглашении, он станет собеседником. Ключи стоит сверять по другому каналу.
Релей или сеть могут задержать и отбросить конверт. Доставка не гарантируется.
Один конверт — один получатель. Внутри только шифртекст, подпись и поля, по которым его можно проверить и доставить.
envelope.json
id
SHA-256 от отправителя, получателя, шифртекста, времени и chainLink.
senderPubKey
Долговременный Ed25519-ключ отправителя. Им же проверяется подпись.
recipientPubKey
Долговременный X25519-ключ получателя. Другим устройствам конверт не расшифровать.
timestamp
UTC-время создания. Слишком далёкое будущее отбрасывается: допуск — 5 минут.
ciphertext
AES-256-GCM: cipher || mac || nonce, целиком в base64. Открытого текста здесь нет.
ephemeralPubKey
Публичная половина пары X25519, созданной только для этого сообщения.
signature
Ed25519 по id, времени, шифртексту и chainLink. Подмена любого поля ломает проверку.
chainLink
id прошлого конверта в этой направленной цепочке. Пусто у первого сообщения.
Конверт принимается только после фиксированного порядка проверок: размер кадра → часы → подпись → id → дубликат → расшифровка. Всё, что не прошло, отбрасывается без логов.
Пять шагов, каждый со своей зоной ответственности.
Отправитель создаёт пару X25519 и вычисляет общий секрет с долговременным ключом получателя.
HKDF превращает общий секрет в ключ AES-256-GCM. Одинаковых ключей у двух сообщений нет.
AES-256-GCM с 12-байтовым nonce возвращает шифртекст и 16-байтовый тег аутентификации.
Ed25519 подписывает id, время, шифртекст и chainLink долговременным ключом отправителя.
Сначала часы, затем подпись, id, дубликаты и только потом расшифровка. Ошибка не переспрашивается.
Лимиты — часть модели: кадр до 256 КиБ, открытый текст до 4 КиБ, будущее время — не больше 5 минут. Это защищает от переполнения памяти и флуда.
Релей — честный, но любопытный посредник. Он не должен уметь читать переписку, и не умеет.
Публичные ключи — псевдонимы, а не имена. Но по частоте и времени переписки можно многое понять: это метаданные, и они остаются видимыми.
Личность Soty — это две пары ключей на устройстве, а не запись на сервере.
Долговременный ключ подписи. Публичная часть уходит в приглашение, приватная не покидает устройство.
Ключ, на который шифруются конверты. Публичная часть нужна собеседнику, приватная — только вам.
История и ключи не синхронизируются между устройствами. Новый телефон начинает с новой личности.
По умолчанию переписка живёт 30 дней. Можно выбрать 7, 90, 180, 365 дней или хранить бессрочно.
Пароль от 6 символов хранится как PBKDF2-HMAC-SHA256 с 210 000 итераций, плюс вход по отпечатку.
Важно: seed-ключи лежат в локальной SQLite в открытом виде. Это задокументированный остаточный риск: при полном доступе к файлам приложения ключи можно извлечь. Для повышенных требований используйте отдельное устройство и блокировку.
Ни одна система не защищает от всего. Эти ограничения лучше знать до, а не после.
Код открыт, но внешний аудит проекта не заявляется. Эта страница не заменяет аудит.
Одноразовые ключи защищают сообщения друг от друга, но долговременный X25519-ключ получателя расшифровывает всё, что ему адресовано.
Публичные ключи стабильны, а релей видит сетевые адреса. Soty скрывает текст, но не факт переписки.
Потеря устройства означает потерю ключей и истории. Экспорта ключей и облачного бэкапа нет.
Исходники, протокол и сборки открыты. Начните с установки, а детали проверьте в коде.