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

Шифрование OMEMO: что это и чем похоже на Signal

OMEMO — сквозное шифрование для XMPP на основе Double Ratchet, как у Signal. Что оно защищает, чего не скрывает и как проверить ключи собеседника.

Обновлено · 6 мин чтения

Коротко

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 простыми словами

  1. У каждого устройства свои ключи. Не у человека, а именно у устройства: телефон и ноутбук одного пользователя — два разных набора ключей. Устройства публикуют свои открытые ключи на сервере.
  2. Первое знакомство — через X3DH. Чтобы начать зашифрованную переписку с устройством, которое сейчас не в сети, отправитель берёт с сервера его заранее выложенный набор ключей (PreKey) и вычисляет общий секрет. В OMEMO используется изменённый вариант X3DH: кривые Curve25519/Ed25519, хеш SHA-256 и обязательный одноразовый PreKey при каждом обмене.
  3. Дальше — Double Ratchet. Для каждого сообщения выводится новый ключ. Как сказано в спецификации Signal, старые ключи нельзя вычислить из новых — это прямая секретность, а свежие значения Диффи — Хеллмана со временем «лечат» сессию после утечки ключа — это восстановление после компрометации.
  4. Один текст — много получателей. Для каждого сообщения создаётся случайный ключ. Сам текст шифруется им один раз, а ключ шифруется отдельно для каждого устройства каждого получателя — и для других ваших устройств, чтобы переписка была видна везде.

Чем OMEMO похоже на Signal и чем отличается

OMEMOПротоколы Signal
Ключи для каждого сообщенияDouble RatchetDouble Ratchet
Первичный обмен ключамиИзменённый X3DHX3DH; опубликована также спецификация PQXDH с постквантовой защитой
Несколько устройствОтдельная сессия с каждым устройством собеседника и с вашими устройствамиОтдельная спецификация Sesame для сессий на нескольких устройствах
Где применяетсяВ приложениях разных разработчиков на открытом стандарте XMPP, между независимыми серверамиСпецификации опубликованы на signal.org
Кто развиваетXMPP Standards FoundationSignal

Сходство — в криптографическом ядре: OMEMO прямо ссылается на спецификации Double Ratchet и X3DH. Различие — в окружении. OMEMO живёт внутри XMPP: сервер может принадлежать вам, а приложение можно выбрать любое совместимое.

Сравнивать их по принципу «что лучше» не имеет смысла: это разные экосистемы с разными задачами. Полезнее понять, от чего защищает сквозное шифрование вообще.

Что OMEMO защищает, а что нет

Защищает:

  • содержимое сообщений — сервер и всё, что между вами, видят только зашифрованные данные;
  • прошлую переписку при утечке текущего ключа — благодаря тому, что ключи меняются на каждом сообщении.

Не защищает:

  • Метаданные. Спецификация говорит прямо: OMEMO не защищает от атак, основанных на метаданных и анализе трафика. Серверу нужно знать адреса отправителя и получателя, чтобы доставить сообщение, он видит время и объём переписки.
  • Список контактов. В XMPP список контактов хранит сервер пользователя — так описано в RFC 6121.
  • Само устройство. Если кто-то получил доступ к разблокированному телефону, он прочитает переписку так же, как вы. Уведомления на экране блокировки показывают текст, если вы это разрешили.
  • Резервные копии вне приложения. Где и как хранятся копии, решаете вы.

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

Поэтому свой сервер и сквозное шифрование дополняют друг друга. OMEMO скрывает текст от любого сервера, а метаданные остаются на сервере, который принадлежит вашей группе, а не крупной платформе.

Как проверить ключи собеседника

Спецификация требует, чтобы приложение не отправляло данные по новой сессии, не убедившись в доверии к ключу. Как именно устанавливать доверие, XEP-0384 оставляет приложениям. Общий принцип такой:

  1. У каждого устройства есть отпечаток — короткая запись открытого ключа. XEP-0384 рекомендует показывать его как восемь групп по восемь символов или QR-кодом.
  2. Сравните отпечатки по другому каналу. Лучше всего — при встрече: откройте в приложении карточку собеседника, найдите список его устройств с отпечатками и сравните с тем, что видит он, или отсканируйте QR-код.
  3. Подтвердите устройство. После проверки приложение помечает его как доверенное.

В Conversations, на котором основано приложение Snikket для Android, есть режим «слепое доверие до проверки» (Blind Trust Before Verification): пока вы ничего не проверяли, приложение доверяет устройствам собеседника, чтобы переписка просто работала. Сообщения с проверенных устройств отмечаются щитом, с непроверенных — замком.

Когда проверка особенно уместна:

  • для переписки, где важна конфиденциальность — документы, пароли, финансы;
  • когда у собеседника внезапно появилось новое устройство, хотя он не менял телефон;
  • после переустановки приложения — у устройства будут новые ключи, и его придётся подтвердить заново.

Ещё одно правило спецификации: при ошибке расшифровки приложение не должно само, без участия пользователя, создавать новую сессию. Если видите сообщение о сбое расшифровки, проверьте у собеседника, не менял ли он устройство. После восстановления из резервной копии сессии иногда ломаются — для этого в приложениях есть ручной сброс сессии.

OMEMO в Snikket

В приложениях Snikket сквозное шифрование OMEMO включено по умолчанию: в личных чатах и закрытых группах ничего настраивать не нужно. Публичные группы Snikket рассчитаны на открытый доступ — обсуждать личное лучше в закрытых.

Snikket умеет делать зашифрованную резервную копию по запросу и восстанавливать её на новом устройстве. Если сменили телефон, собеседники, которые проверяют ключи, увидят новое устройство — подтвердите его при встрече. Как подключить второе устройство и где в приложении что находится, — в руководстве «Snikket: как пользоваться».

Если вы решаете, где держать сервер, сравните варианты в материале «Snikket на своём Docker или готовый хостинг», а как выглядит закрытый сервер для близких — на странице «Свой мессенджер для семьи».

Источники

Частые вопросы

OMEMO и Signal — это одно и то же?

Нет, но у них общая основа. OMEMO — расширение XMPP (XEP-0384), которое использует алгоритм Double Ratchet и вариант обмена ключами X3DH, опубликованные Signal. Протокол передачи сообщений, серверы и приложения при этом разные.

Видит ли сервер, с кем я переписываюсь?

Да. OMEMO шифрует содержимое сообщений, но не метаданные: серверу нужно знать, кому доставить сообщение. Спецификация прямо говорит, что OMEMO не защищает от анализа метаданных и трафика.

Зачем проверять ключи, если шифрование и так включено?

Проверка подтверждает, что ключ принадлежит устройству вашего собеседника, а не подставлен кем-то посередине. Без неё шифрование работает, но вы полагаетесь на то, что ключи пришли без подмены.

Включено ли OMEMO в Snikket по умолчанию?

Да, в приложениях Snikket сквозное шифрование OMEMO включено по умолчанию — ничего настраивать не нужно.