Шифрование OMEMO: что это и чем похоже на Signal
OMEMO — сквозное шифрование для XMPP на основе Double Ratchet, как у Signal. Что оно защищает, чего не скрывает и как проверить ключи собеседника.
Коротко
OMEMO — это сквозное шифрование для мессенджеров на стандарте XMPP. Оно описано в расширении XEP-0384 и построено на алгоритме Double Ratchet и схеме обмена ключами X3DH — тех самых, спецификации которых опубликовал Signal. Сообщение шифруется на устройстве отправителя и расшифровывается только на устройствах получателей; сервер его передаёт, но прочитать не может.
При этом OMEMO не прячет метаданные: сервер знает, кто, кому и когда пишет. А чтобы быть уверенным, что вы шифруете именно для собеседника, ключи его устройств стоит один раз проверить. Ниже — как это устроено и что делать на практике.
Что такое OMEMO
XMPP — открытый стандарт обмена сообщениями, бывший Jabber (подробнее — в материале «Что такое XMPP и Snikket»). Сам по себе XMPP защищает соединения через TLS: никто по дороге не подслушает трафик, но сервер видит текст сообщений.
OMEMO добавляет следующий уровень — сквозное шифрование. Его описывает расширение XEP-0384 «OMEMO Encryption», которое публикует XMPP Standards Foundation. Последняя версия спецификации — 0.9.1 от 6 апреля 2026 года. Формально у неё статус Experimental: так XSF помечает расширения, которые ещё могут меняться. На практике OMEMO давно встроено в популярные XMPP-приложения, в том числе в Conversations и в приложения Snikket.
Главные свойства OMEMO по спецификации:
- работает в личных и групповых чатах;
- рассчитано на то, что у человека несколько устройств — телефон, планшет, компьютер;
- позволяет написать собеседнику, даже если он сейчас не в сети.
Как работает OMEMO простыми словами
- У каждого устройства свои ключи. Не у человека, а именно у устройства: телефон и ноутбук одного пользователя — два разных набора ключей. Устройства публикуют свои открытые ключи на сервере.
- Первое знакомство — через X3DH. Чтобы начать зашифрованную переписку с устройством, которое сейчас не в сети, отправитель берёт с сервера его заранее выложенный набор ключей (PreKey) и вычисляет общий секрет. В OMEMO используется изменённый вариант X3DH: кривые Curve25519/Ed25519, хеш SHA-256 и обязательный одноразовый PreKey при каждом обмене.
- Дальше — Double Ratchet. Для каждого сообщения выводится новый ключ. Как сказано в спецификации Signal, старые ключи нельзя вычислить из новых — это прямая секретность, а свежие значения Диффи — Хеллмана со временем «лечат» сессию после утечки ключа — это восстановление после компрометации.
- Один текст — много получателей. Для каждого сообщения создаётся случайный ключ. Сам текст шифруется им один раз, а ключ шифруется отдельно для каждого устройства каждого получателя — и для других ваших устройств, чтобы переписка была видна везде.
Чем OMEMO похоже на Signal и чем отличается
| OMEMO | Протоколы Signal | |
|---|---|---|
| Ключи для каждого сообщения | Double Ratchet | Double Ratchet |
| Первичный обмен ключами | Изменённый X3DH | X3DH; опубликована также спецификация PQXDH с постквантовой защитой |
| Несколько устройств | Отдельная сессия с каждым устройством собеседника и с вашими устройствами | Отдельная спецификация Sesame для сессий на нескольких устройствах |
| Где применяется | В приложениях разных разработчиков на открытом стандарте XMPP, между независимыми серверами | Спецификации опубликованы на signal.org |
| Кто развивает | XMPP Standards Foundation | Signal |
Сходство — в криптографическом ядре: OMEMO прямо ссылается на спецификации Double Ratchet и X3DH. Различие — в окружении. OMEMO живёт внутри XMPP: сервер может принадлежать вам, а приложение можно выбрать любое совместимое.
Сравнивать их по принципу «что лучше» не имеет смысла: это разные экосистемы с разными задачами. Полезнее понять, от чего защищает сквозное шифрование вообще.
Что OMEMO защищает, а что нет
Защищает:
- содержимое сообщений — сервер и всё, что между вами, видят только зашифрованные данные;
- прошлую переписку при утечке текущего ключа — благодаря тому, что ключи меняются на каждом сообщении.
Не защищает:
- Метаданные. Спецификация говорит прямо: OMEMO не защищает от атак, основанных на метаданных и анализе трафика. Серверу нужно знать адреса отправителя и получателя, чтобы доставить сообщение, он видит время и объём переписки.
- Список контактов. В XMPP список контактов хранит сервер пользователя — так описано в RFC 6121.
- Само устройство. Если кто-то получил доступ к разблокированному телефону, он прочитает переписку так же, как вы. Уведомления на экране блокировки показывают текст, если вы это разрешили.
- Резервные копии вне приложения. Где и как хранятся копии, решаете вы.
Отдельная оговорка из спецификации: прямая секретность работает в полную силу только после того, как обе стороны завершили обмен ключами. Самые первые сообщения новой сессии защищены слабее.
Поэтому свой сервер и сквозное шифрование дополняют друг друга. OMEMO скрывает текст от любого сервера, а метаданные остаются на сервере, который принадлежит вашей группе, а не крупной платформе.
Как проверить ключи собеседника
Спецификация требует, чтобы приложение не отправляло данные по новой сессии, не убедившись в доверии к ключу. Как именно устанавливать доверие, XEP-0384 оставляет приложениям. Общий принцип такой:
- У каждого устройства есть отпечаток — короткая запись открытого ключа. XEP-0384 рекомендует показывать его как восемь групп по восемь символов или QR-кодом.
- Сравните отпечатки по другому каналу. Лучше всего — при встрече: откройте в приложении карточку собеседника, найдите список его устройств с отпечатками и сравните с тем, что видит он, или отсканируйте QR-код.
- Подтвердите устройство. После проверки приложение помечает его как доверенное.
В Conversations, на котором основано приложение Snikket для Android, есть режим «слепое доверие до проверки» (Blind Trust Before Verification): пока вы ничего не проверяли, приложение доверяет устройствам собеседника, чтобы переписка просто работала. Сообщения с проверенных устройств отмечаются щитом, с непроверенных — замком.
Когда проверка особенно уместна:
- для переписки, где важна конфиденциальность — документы, пароли, финансы;
- когда у собеседника внезапно появилось новое устройство, хотя он не менял телефон;
- после переустановки приложения — у устройства будут новые ключи, и его придётся подтвердить заново.
Ещё одно правило спецификации: при ошибке расшифровки приложение не должно само, без участия пользователя, создавать новую сессию. Если видите сообщение о сбое расшифровки, проверьте у собеседника, не менял ли он устройство. После восстановления из резервной копии сессии иногда ломаются — для этого в приложениях есть ручной сброс сессии.
OMEMO в Snikket
В приложениях Snikket сквозное шифрование OMEMO включено по умолчанию: в личных чатах и закрытых группах ничего настраивать не нужно. Публичные группы Snikket рассчитаны на открытый доступ — обсуждать личное лучше в закрытых.
Snikket умеет делать зашифрованную резервную копию по запросу и восстанавливать её на новом устройстве. Если сменили телефон, собеседники, которые проверяют ключи, увидят новое устройство — подтвердите его при встрече. Как подключить второе устройство и где в приложении что находится, — в руководстве «Snikket: как пользоваться».
Если вы решаете, где держать сервер, сравните варианты в материале «Snikket на своём Docker или готовый хостинг», а как выглядит закрытый сервер для близких — на странице «Свой мессенджер для семьи».
Источники
- XEP-0384: OMEMO Encryption — версия 0.9.1, 06.04.2026
- Signal: The Double Ratchet Algorithm
- Signal: The X3DH Key Agreement Protocol
- Signal: спецификации (PQXDH, Sesame и другие)
- RFC 6121: XMPP Instant Messaging and Presence
- Conversations: OMEMO
- Conversations: история изменений (режим Blind Trust Before Verification)
- Snikket: возможности приложения
Частые вопросы
OMEMO и Signal — это одно и то же?
Нет, но у них общая основа. OMEMO — расширение XMPP (XEP-0384), которое использует алгоритм Double Ratchet и вариант обмена ключами X3DH, опубликованные Signal. Протокол передачи сообщений, серверы и приложения при этом разные.
Видит ли сервер, с кем я переписываюсь?
Да. OMEMO шифрует содержимое сообщений, но не метаданные: серверу нужно знать, кому доставить сообщение. Спецификация прямо говорит, что OMEMO не защищает от анализа метаданных и трафика.
Зачем проверять ключи, если шифрование и так включено?
Проверка подтверждает, что ключ принадлежит устройству вашего собеседника, а не подставлен кем-то посередине. Без неё шифрование работает, но вы полагаетесь на то, что ключи пришли без подмены.
Включено ли OMEMO в Snikket по умолчанию?
Да, в приложениях Snikket сквозное шифрование OMEMO включено по умолчанию — ничего настраивать не нужно.