diff --git a/src/pages/posts/2026/encrypted_XMPP.md b/src/pages/posts/2026/encrypted_XMPP.md index 40e199e..ae4eb8c 100644 --- a/src/pages/posts/2026/encrypted_XMPP.md +++ b/src/pages/posts/2026/encrypted_XMPP.md @@ -38,7 +38,8 @@ and the practical aspects of using it. **End-to-end encryption** is a way to keep your chats truly private.
Only you and the person you’re messaging can read the messages. -Not even the server owner has the keys needed to decrypt or modify them. +Not even the server owner or your carrier has the keys +needed to decrypt or modify them. **XMPP** is an extensible protocol for instant messaging. It's open, decentralized, and mature. @@ -50,23 +51,7 @@ it on a dedicated page by Daniel Gultsch. -Хочу также отметить, -что я буду использовать слово Client для обозначения конкретных инстансов -приложений на пользовательских устройствах. В документации, связанной с OMEMO -для этого использвется термин Device, но мне он кажется запутывающим: -в реальности на одном устройстве может быть несколько независимых клиентов. - -## Basic Concepts - -Here I'm going to explain some basic ideas behind e2e. - -Если основные концепции и терминология вам знакомы, -то можете смело пропустить этот раздел -и перейти к особенностям их практического применения касательно XMPP. - -Или даже сразу перейти к описанию workflow, которого я придерживаюсь сам. - -### Trade-offs Between Safety and Convenience +## Trade-offs Between Safety and Convenience Unfortunately, things that are truly secure are rarely convenient. They often require some initial efforts and a bit of ongoing attention. @@ -105,277 +90,3 @@ In general, the XMPP experience today could be described as a "WhatsApp with benefits and frictions". It's kinda ironic, considering that WhatsApp’s protocol is actually based on XMPP, but incompatibly altered and defederated. - -### Keys, Fingerprints and Trust - -OMEMO построен вокруг Double Ratchet Algorithm. -Там внутри всё очень интересно, -но нам для практического применения важно только то, -что каждый клиент пользователя хранит в себе какие-то там ключи, -и умеет получать из них какой-то там хэш, -который принято называть fingerprint. - -Ключи обычно как-то автоматически управляются XMPP клиентом -и в норме вам никогда не стоит трогать их руками. -Возможно, вам лучше даже и не знать, как они выглядят. -Единственное, что с ними нужно делать -- -держать в секрете и бэкапить при необходимости. - -Фингерпринт позволяет отличать конкретный -клиент собеседника и быть уверенным, что его не подмененили. -Список фингерпринтов для конкретного аккаунта -не является чем-то секретным: -клиентские приложения сами анонсируют свои фингерпнинты на сервере -и автоматически пополняют список чужих. -Значение имеют только те, -которые вы пометили как фингерпринты довереных клиентов. - -В идеале, человек должен лично при встрече -или по уже довереному и безопасному каналу связи -сказать вам "Да, фингерпринт XXX принадлежит моему устройству" -и только после этого вы помечаете XXX доверенным. -Обычно в интерфейсе это просто проставление чекбокса или сканирование QR-кода. - -Некоторые клиенты для удобства пользователя -довериют любым новым фингерпринтам контактов по-умолчанию, -но я не стал бы рекомендовать использовать такую политику, -это легкомысленно и небезопасно. -Политики доверия или недоверия -можно посмотреть или поменять в настройках вашего клиента. - -Список доверенных фингерпринтов используется в момент отправки сообщения: -OMEMO творит какую-то магию с жонглированием ключами и -ни один клиент, кроме перечисленных в списке на момент зашифровки, -не сможет его впоследствии расшифровать. -Передать как-то доверие в прошлое, увы, невозможно. - -## Реалии OMEMO и XMPP -## Особенности OMEMO и XMPP - -### Chat History - -Вообще, XMPP поддерживает хранение истории переписок на сервере. -За это отвечает **XEP-0313: Message Archive Management**. - -В реальности поддержка этого XEP, -политика хранения истории и особенно сроки хранения сообщений -зависят от конкретного сервера. -Рассчитывать по-умолчанию на бессрочное хранение всех переписок не стоит. - -В конечном счёте, -ответственность за хранение переписок лежит исключительно на вас -и это разумное место для применения local-first подхода. - -С практической точки зрения -проще всего рассматривать серверный архив сообщений -как некоторый кэш, который выручит вас по возвращении -из непродолжительного офлайна -или поможет с синхронизацей текущей переписки между разными устройствами. - -### Synchronisation - -За бесшовное переключение между клиентами отвечает -**XEP-0280: Message Carbons**. -До его внедрения можно было переключиться с телефона на лэптоп -и пялиться в загруженную историю переписки, -состоящей только из входящих сообщений от собеседника. -Отправка своих же сообщений ещё и самому себе -на уровне протокола -- это довольно неочевидная фича. - -Тут важно упомянуть, что при использовании e2e шифрования, -упомянутая выше концепция доверенных отпечатков пальцев -распространяется и на свои клиенты тоже. - -Для бесшовной синхронизации исходящих сообщений -все ваши клиенты должны считать фингерпринты друг друга доверенными, -иначе можно столкнуться с ситуацией, -когда не получается прочитать своё же сообщение. - -Логичное, но неприятное следствие: -Новый клиент или старый, -который не был в списке доверенных на момент отправки сообщений, -получит историю из MAM, но не сможет её расшифровать. -Да, даже ваши сообщения. -Теоретически, перепаковка сообщений -на старых доверенных клиентах вроде как возможна, -но на практике, никто такое пока не имплементировал -и важные вещи придётся пересылать вручную. - -### Message Correction - -Тут же стоит отметить, что такие простые и понятные на первый взгляд фичи -как редактирование и удаление сообщений вообще-то полагаются на -клиентский код и могут не сработать у вашего собеседника так, -как вы этого ожидаете. -Ими можно пользоваться, -это удобно и некоторые клиенты их отлично поддерживают, -но полагаться на них для сокрытия чего-либо не стоит. - -### Maintenance - -OMEMO был задуман как решение, которое после настройки не требует какого-то -дополнительного вмешательства. -Можно считать, что этой заявленной цели удалось достичь -и при наличии базового понимания работы протокола и регулярном онлайне -никаких сюрпризов быть не должно. - -Всё обслуживание заключается в регулярных бэкапах и -уведомлении своих контактов о фингерпринтах, -которые стоит добавить в список доверенных или убрать из него. -В нашем локальном хакспейсе мы даже проводим для этого регулярные события =) - -## Step-by-step guide - -Представим, что у меня есть аккаунт jid@some.server и несколько устройств: -телефон, ноутбук и настольный компьютер. -Сначала я опишу воркфлоу общими словами, -а потом дам уточнения про использование конкретных приложений. - -Я предпочитаю следовать такому майндсету: -С одной стороны, -у меня есть мобильное устройство, -которое всегда со мной и практические всегда онлайн: -на нём я храню полную историю переписок и получаю уведомления в реальном -времени. -С другой стороны, у меня есть несколько десктопных приложений: -я открываю их только когда мне нужно обсудить что-нибудь с использованием -клавиатуры или копи-пастинга. -Мне нравится думать о них, как о приложениях-сателлитах. - -### Before the Start - -Первым делом мне нужно сгенерировать на каждом устройстве приватные ключи. -Обычно это происходит автоматически. - -Потом я должен на каждом своём устройстве добавить остальные: -телефон должен считать все мои компьютеры доверенными устройствами, -а компьютеры доверять друг другу и телефону. - -Фингерпринты публичные, -их можно даже разместить у себя на какой-нибудь личной странице. -Вот, например, моя: https://oddsquat.org/about/keys/ - -### Start the Conversation in Person - -Предположим, я встретил Алису и мы решили обменяться контактами. -Я открыл на телефоне специальный QR-код, -затем Алиса считала его своим клиентом. -В этот QR-код уже зашиты фингерпринты всех моих устройств, так что -дополнительных действий не требуется. -Аналогично, я своим мобильным клиентом считываю QR-код с экрана Алисы. - -Теперь мы оба уверены, что в переписке будем участвовать именно мы, -а все наши сообщения будут доступны на всех наших устройствах и только на них. - -### Start the Conversation Online - -Предположим, что мы начали обсуждать что-то с Бобом где-то в сети -(на форуме, в федиверсе, не важно) и решили продолжить обсуждение в мессенджере. - -Боб инициирует переписку, я слепо доверяю первому устройству, -с которого он мне написал и уже потом мы обмениваемся в переписке -фингерпринтами остальных наших устройств, если они есть. -Такая стратегия называется ToFu. - -Опять же Боб может убедиться, что я это я с помощью моей страницы с ключами, -а я могу убедиться, что Боб на форуме -- тот же самый Боб, попросив его -прислать мне фингерпринты прямо в личных сообщениях на том же самом форуме или -отдельно посредством email, например. - -В идеальном случае, -у Боба тоже есть какая-то публичная страница с фингерпринтами. -Тогда мы оба можем независимо убедиться, -что мы именно те, за кого себя выдаём =) - -### New or Lost Devices - -Если я решил начать использовать -какое-то новое устройство или установить куда-нибудь -ещё одно клиентское приложение, -то первым делом я должен добавить его в список доверенных клиентов -на остальных моих существующих устройствах. - -Если я по каким-либо причинам потеряю любое из своих устройств -или зачем-то удалю один из своих приватных ключей, -то первым делом я должен исключить такой клиент из списка доверенных -на остальных моих устройствах. - -После актуализации моих личных списков доверенных устройств -стоит сообщить об изменениях моим собеседникам по довереным каналам. -Я могу просто попросить Алису считать мой новый QR-код при следующей встрече, -а Бобу отправить сообщение о том, -что утраченому устройству доверять больше не стоит, -настоящих сообщений с него уже никогда не придёт. - -## Client Applications - -Этот раздел описывает особенности применения OMEMO для конкретных клиентов, -которыми я пользуюсь сам. - -### Conversations, Monocles and Other Forks - -Conversation - это современное полнофункциональное чат-приложение. -Оно поддерживает всё, что должно поддерживать: -переписки, звонки, отправку фотографий и файлов. -У него есть несколько форков, в которых UX может отличаться, -но core-фичи работают абсолютно одинаково. - -На экране с информацией о конакте (в том числе и о своём аккаунте) -можно увидеть список фингерпринтов, -вручную отметить галочкой доверенные или отозвать доверие. - -Упростить все эти рутинные вещи призвана система с QR-кодами: -прямо на главном можно показать свой код или считать чужой. -Так верификация устройств при личной встрече становится простой и ненапряжной. - -Правило большого пальца - сканируй QR-код при каждом удобном случае. - -### Dino - -Это лёгкий GUI-клиент, построенный на GTK фреймвоке. -Опять же, все вопросы доверия и недоверия -можно легко решить на экране "Детали контакта" с помощью чекбоксов. - -К сожалению, по умолчанию, Dino настроен на автоматическое доверие -новым фингерпринтам, я рекомендую эту функцию отключить. - -### Profanity - -Это могучий TUI-клиент, -где всё-всё-всё реализовано через встроенную систему команд. - -Если вы зачем-то намерены им пользоваться, -то ниже вас ожидает небольшой читшит по использованию OMEMO, -но я настойчиво рекомендую ознакомиться с полной документацией самостоятельно. - -- Генерация ключа и добавление своих устройств: - ```text - /omemo gen - /omemo trust me@some.server some-cool-fingerprint-01 - /omemo trust me@some.server another-cool-fingerprint - /omemo qrcode - ``` - -- Увидеть список своих или чужих fingerprint'ов: - ```text - /omemo fingerprint me@some.server - /omemo fingerprint alice@another.server - ``` - Доверенные будут помечены как `trusted`. - -- Начать зашифрованный диалог: - ```text - /omemo start alice@another.server - ``` - -- Добавить чужой фингерпринт в список доверенных: - ```text - /omemo trust alice@another.server some-cool-fingerprint-02 - /omemo trust alice@another.server some-cool-fingerprint-03 - /omemo trust bob@another.server some-cool-fingerprint-04 - ``` - -- Перестать доверять кокретному клиенту: - ```text - /omemo untrust alice@another.server some-cool-fingerprint-02 - ```