Soty

Безопасность

Что именно защищает Soty

Сквозное шифрование — это не галочка в интерфейсе, а конкретный конверт, фиксированный порядок проверок и список допущений. Здесь — что проект делает, что видит посредник и где заканчиваются гарантии.

Код приложения и релея открыт: проверять можно не только эту страницу.

AES-256-GCM

Каждое сообщение шифруется отдельным ключом, а тег аутентификации ловит подмену до расшифровки.

Одноразовые ключи

На каждое сообщение — новая пара X25519. Два одинаковых текста выглядят как разные наборы байт.

Подпись Ed25519

Конверт подписан долговременным ключом отправителя: текст, получатель и время защищены от подмены.

Релей без плейнтекста

Узел хранит только шифрованные конверты и метаданные. Расшифровать их он не может.

Модель угроз

Безопасность — это всегда список того, от кого и от чего мы защищаемся. Вот честная граница.

От чего защищает

  • От прослушивания сети

    Провайдер, оператор Wi-Fi или владелец релея видят только шифртекст и служебные поля.

  • От подмены сообщения

    Подпись Ed25519 и идентификатор конверта не дают изменить текст, получателя или время по дороге.

  • От поддельной истории

    chainLink связывает сообщения в направленную цепочку: вставить или переставить конверт незаметно не получится.

  • От чужого аккаунта

    Аккаунтов нет: угнать пароль или почту невозможно, потому что их не существует.

  • От утечки базы релея

    Даже полный дамп узла не раскрывает переписку — ключей получателей там нет.

От чего не защищает

  • От взлома устройства

    Кто получил доступ к разблокированному телефону или к файлам приложения, видит ключи и переписку.

  • От метаданных

    Релей и сеть видят, кто, когда и сколько отправил. Это не скрывается, а минимизируется.

  • От получателя

    Собеседник читает сообщение легально. Скриншот или пересылка — уже вне зоны шифрования.

  • От подмены приглашения

    Если злоумышленник подменит ключи в приглашении, он станет собеседником. Ключи стоит сверять по другому каналу.

  • От отказа в обслуживании

    Релей или сеть могут задержать и отбросить конверт. Доставка не гарантируется.

Анатомия конверта

Один конверт — один получатель. Внутри только шифртекст, подпись и поля, по которым его можно проверить и доставить.

envelope.json

id Адрес содержимого
senderPubKey Кто подписал
recipientPubKey Кому
timestamp Когда
ciphertext Что
ephemeralPubKey Одноразовый ключ
signature Подпись
chainLink Предыдущее сообщение

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 → дубликат → расшифровка. Всё, что не прошло, отбрасывается без логов.

От текста до расшифровки

Пять шагов, каждый со своей зоной ответственности.

  1. 1

    Одноразовый обмен

    Отправитель создаёт пару X25519 и вычисляет общий секрет с долговременным ключом получателя.

  2. 2

    Вывод ключа

    HKDF превращает общий секрет в ключ AES-256-GCM. Одинаковых ключей у двух сообщений нет.

  3. 3

    Шифрование

    AES-256-GCM с 12-байтовым nonce возвращает шифртекст и 16-байтовый тег аутентификации.

  4. 4

    Подпись

    Ed25519 подписывает id, время, шифртекст и chainLink долговременным ключом отправителя.

  5. 5

    Проверка на приёмнике

    Сначала часы, затем подпись, id, дубликаты и только потом расшифровка. Ошибка не переспрашивается.

Лимиты — часть модели: кадр до 256 КиБ, открытый текст до 4 КиБ, будущее время — не больше 5 минут. Это защищает от переполнения памяти и флуда.

Что видит релей

Релей — честный, но любопытный посредник. Он не должен уметь читать переписку, и не умеет.

Видит

  • Кто отправил и кому — по публичным ключам
  • Когда создан конверт и сколько он лежит
  • Размер конверта и число хопов
  • Подпись и идентификатор для проверки

Не видит

  • Текст сообщения и вложения
  • Приватные ключи и seed-фразы
  • Имена из адресной книги
  • Расшифрованную историю после доставки

Публичные ключи — псевдонимы, а не имена. Но по частоте и времени переписки можно многое понять: это метаданные, и они остаются видимыми.

Ключи и локальные данные

Личность Soty — это две пары ключей на устройстве, а не запись на сервере.

Ed25519 — кто вы

Долговременный ключ подписи. Публичная часть уходит в приглашение, приватная не покидает устройство.

X25519 — как вам пишут

Ключ, на который шифруются конверты. Публичная часть нужна собеседнику, приватная — только вам.

Одно устройство — одна личность

История и ключи не синхронизируются между устройствами. Новый телефон начинает с новой личности.

Срок хранения

По умолчанию переписка живёт 30 дней. Можно выбрать 7, 90, 180, 365 дней или хранить бессрочно.

Блокировка приложения

Пароль от 6 символов хранится как PBKDF2-HMAC-SHA256 с 210 000 итераций, плюс вход по отпечатку.

Важно: seed-ключи лежат в локальной SQLite в открытом виде. Это задокументированный остаточный риск: при полном доступе к файлам приложения ключи можно извлечь. Для повышенных требований используйте отдельное устройство и блокировку.

Границы, которые стоит знать

Ни одна система не защищает от всего. Эти ограничения лучше знать до, а не после.

Нет независимого аудита

Код открыт, но внешний аудит проекта не заявляется. Эта страница не заменяет аудит.

Нет forward secrecy при краже ключа

Одноразовые ключи защищают сообщения друг от друга, но долговременный X25519-ключ получателя расшифровывает всё, что ему адресовано.

Нет анонимности

Публичные ключи стабильны, а релей видит сетевые адреса. Soty скрывает текст, но не факт переписки.

Нет резервных копий

Потеря устройства означает потерю ключей и истории. Экспорта ключей и облачного бэкапа нет.

Проверьте сами

Исходники, протокол и сборки открыты. Начните с установки, а детали проверьте в коде.