Как устроен зашифрованный чат Amorely
Чат Amorely рассчитан на то, чтобы переписку могли прочитать только двое. Сервер хранит сообщения и доставляет их в реальном времени, но не получает текст, который можно открыть из базы.
У каждого устройства есть своя пара ключей ECDH на кривой P-256. Она создаётся в браузере. Публичный ключ можно отдать партнёру. Приватный ключ с устройства не уходит.
Когда вы отправляете сообщение, браузер берёт ваш приватный ключ и публичный ключ партнёра и получает общий секрет длиной 256 бит. Этот секрет используется как ключ AES-GCM. Для каждого сообщения генерируется новый вектор инициализации на 12 байт. В сеть уходят шифротекст, этот вектор, версия и идентификатор устройства отправителя. Алгоритм в полезной нагрузке называется ECDH-P256-AES-GCM.
Сокет доставляет тот же зашифрованный пакет, что записан в базе. Расшифровка происходит уже в браузере получателя, тем же общим секретом. Отдельного ключа «для поддержки» нет: если потеряны оба устройства и резервная фраза, сервис не сможет открыть старые сообщения.
Резервная фраза — 12 слов. Из неё через PBKDF2 (SHA-256, 250 000 итераций) получается ключ AES-256-GCM, которым на устройстве закрываются локальные ключи. Фраза нужна, чтобы восстановить доступ, а не чтобы сервер хранил копию переписки.
Поэтому в базе нет поля с текстом сообщения. Есть шифротекст. Поиск по словам переписки на сервере из этой схемы не сделать: индексировать нечего.