diff --git a/src/pages/posts/2026/encrypted_XMPP.md b/src/pages/posts/2026/encrypted_XMPP.md index 40e199e..12b8e71 100644 --- a/src/pages/posts/2026/encrypted_XMPP.md +++ b/src/pages/posts/2026/encrypted_XMPP.md @@ -15,7 +15,7 @@ description: 'Secure and private messaging with XMPP and OMEMO encryption.' I find it funny that twenty years ago I was already trying to promote XMPP over ICQ to my classmates. -At that time, the proprietary messenger once again made life harder +At the time, the proprietary messenger kept making life harder for users of alternative clients. That’s when I realized that I prefer protocols over services. @@ -50,21 +50,21 @@ it on a dedicated page by Daniel Gultsch. -Хочу также отметить, -что я буду использовать слово Client для обозначения конкретных инстансов -приложений на пользовательских устройствах. В документации, связанной с OMEMO -для этого использвется термин Device, но мне он кажется запутывающим: -в реальности на одном устройстве может быть несколько независимых клиентов. +**Client**, in this post, +means a specific instance of an XMPP application on a user device. +
OMEMO-related documentation uses the term Device, +but I find it potentially confusing: +in practice, a single physical device can run multiple independent clients. ## Basic Concepts -Here I'm going to explain some basic ideas behind e2e. +This section introduces some basic ideas behind end-to-end encryption. -Если основные концепции и терминология вам знакомы, -то можете смело пропустить этот раздел -и перейти к особенностям их практического применения касательно XMPP. - -Или даже сразу перейти к описанию workflow, которого я придерживаюсь сам. +If you're already familiar with the concepts and terminology, +you can skip ahead to how end-to-end encryption affects the XMPP user experience +or jump straight to the step-by-step workflow I personally use. ### Trade-offs Between Safety and Convenience @@ -108,247 +108,240 @@ is actually based on XMPP, but incompatibly altered and defederated. ### Keys, Fingerprints and Trust -OMEMO построен вокруг Double Ratchet Algorithm. -Там внутри всё очень интересно, -но нам для практического применения важно только то, -что каждый клиент пользователя хранит в себе какие-то там ключи, -и умеет получать из них какой-то там хэш, -который принято называть fingerprint. +OMEMO is based on the Double Ratchet Algorithm. +While the internal details are quite interesting, +for practical purposes it's enough to know that +each client stores some cryptographic keys +and can derive a hash from them, commonly called a fingerprint. -Ключи обычно как-то автоматически управляются XMPP клиентом -и в норме вам никогда не стоит трогать их руками. -Возможно, вам лучше даже и не знать, как они выглядят. -Единственное, что с ними нужно делать -- -держать в секрете и бэкапить при необходимости. +Keys are usually managed automatically by the XMPP client, +and in normal use you should never need to handle them manually. +In fact, you probably don’t even need to know what they look like. -Фингерпринт позволяет отличать конкретный -клиент собеседника и быть уверенным, что его не подмененили. -Список фингерпринтов для конкретного аккаунта -не является чем-то секретным: -клиентские приложения сами анонсируют свои фингерпнинты на сервере -и автоматически пополняют список чужих. -Значение имеют только те, -которые вы пометили как фингерпринты довереных клиентов. +A fingerprint lets you identify a specific client of your contact +and verify that it hasn’t been spoofed. +Fingerprints for an account are not secret: +clients publish their own fingerprints to the XMPP server +and automatically receive the fingerprints of others. +Only fingerprints you explicitly mark as trusted are relevant. -В идеале, человек должен лично при встрече -или по уже довереному и безопасному каналу связи -сказать вам "Да, фингерпринт XXX принадлежит моему устройству" -и только после этого вы помечаете XXX доверенным. -Обычно в интерфейсе это просто проставление чекбокса или сканирование QR-кода. +In an ideal scenario, the contact should confirm in person +or through an already trusted and secure communication channel +that the fingerprint belongs to their device, +and only then you mark it as trusted. +In most XMPP clients this is simply done by ticking a checkbox +or by scanning a QR code. -Некоторые клиенты для удобства пользователя -довериют любым новым фингерпринтам контактов по-умолчанию, -но я не стал бы рекомендовать использовать такую политику, -это легкомысленно и небезопасно. -Политики доверия или недоверия -можно посмотреть или поменять в настройках вашего клиента. +The list of trusted fingerprints is used at the moment a message is sent. +Behind the scenes, OMEMO performs a certain amount of key management, +and only the clients that are present in the trusted list +at the time of encryption will be able to decrypt the message later. -Список доверенных фингерпринтов используется в момент отправки сообщения: -OMEMO творит какую-то магию с жонглированием ключами и -ни один клиент, кроме перечисленных в списке на момент зашифровки, -не сможет его впоследствии расшифровать. -Передать как-то доверие в прошлое, увы, невозможно. +It's important to understand that trust cannot be applied retroactively: +it's not possible to "extend" trust to new clients +after a message has already been encrypted and sent. -## Реалии OMEMO и XMPP -## Особенности OMEMO и XMPP +## Practical Aspects of OMEMO and XMPP ### Chat History -Вообще, XMPP поддерживает хранение истории переписок на сервере. -За это отвечает **XEP-0313: Message Archive Management**. +In theory, XMPP supports server-side message history storage via +**XEP-0313: Message Archive Management**. -В реальности поддержка этого XEP, -политика хранения истории и особенно сроки хранения сообщений -зависят от конкретного сервера. -Рассчитывать по-умолчанию на бессрочное хранение всех переписок не стоит. +In practice, support for this XEP, +as well as retention policies and message lifetime, +depends on the specific server. +You should never assume that all conversations are stored +indefinitely by default. +From a practical standpoint, +the server-side MAM archive is better considered a cache: +it can help you handle recent messages after a short period offline +or synchronize conversations across multiple devices. -В конечном счёте, -ответственность за хранение переписок лежит исключительно на вас -и это разумное место для применения local-first подхода. +At the end of the day, keeping your chat history is your responsibility, +and this is a good place to apply a local-first approach. -С практической точки зрения -проще всего рассматривать серверный архив сообщений -как некоторый кэш, который выручит вас по возвращении -из непродолжительного офлайна -или поможет с синхронизацей текущей переписки между разными устройствами. ### Synchronisation -За бесшовное переключение между клиентами отвечает +Seamless switching between clients is handled by **XEP-0280: Message Carbons**. -До его внедрения можно было переключиться с телефона на лэптоп -и пялиться в загруженную историю переписки, -состоящей только из входящих сообщений от собеседника. -Отправка своих же сообщений ещё и самому себе -на уровне протокола -- это довольно неочевидная фича. +Before its introduction, only incoming messages were synced between devices, +while your own outgoing messages were not. +Protocol-level mirroring of your own messages +is a rather non-obvious feature :D -Тут важно упомянуть, что при использовании e2e шифрования, -упомянутая выше концепция доверенных отпечатков пальцев -распространяется и на свои клиенты тоже. +It's important to note that with end-to-end encryption, +the concept of trusted fingerprints also applies to your own clients. +For seamless synchronisation of outgoing messages, +all your clients must trust each other's fingerprints. +A new client, +or an old one that was not trusted at the time messages were sent, +will receive the full history from MAM but will not be able to decrypt it. +
Yes, even your own messages. -Для бесшовной синхронизации исходящих сообщений -все ваши клиенты должны считать фингерпринты друг друга доверенными, -иначе можно столкнуться с ситуацией, -когда не получается прочитать своё же сообщение. - -Логичное, но неприятное следствие: -Новый клиент или старый, -который не был в списке доверенных на момент отправки сообщений, -получит историю из MAM, но не сможет её расшифровать. -Да, даже ваши сообщения. -Теоретически, перепаковка сообщений -на старых доверенных клиентах вроде как возможна, -но на практике, никто такое пока не имплементировал -и важные вещи придётся пересылать вручную. +In theory, re-encrypting messages on already trusted clients +could solve this issue, but no XMPP client implements it yet. +So in practice you may need to manually resend +some data to a new device. ### Message Correction -Тут же стоит отметить, что такие простые и понятные на первый взгляд фичи -как редактирование и удаление сообщений вообще-то полагаются на -клиентский код и могут не сработать у вашего собеседника так, -как вы этого ожидаете. -Ими можно пользоваться, -это удобно и некоторые клиенты их отлично поддерживают, -но полагаться на них для сокрытия чего-либо не стоит. +It’s worth keeping in mind that +features that seem simple and straightforward at first glance, +such as message editing and deletion, +actually rely on client-side implementation +and may not behave for your recipient the way you expect. + +They’re fine to use and are well supported in some clients, +but you shouldn’t rely on them to hide anything. ### Maintenance -OMEMO был задуман как решение, которое после настройки не требует какого-то -дополнительного вмешательства. -Можно считать, что этой заявленной цели удалось достичь -и при наличии базового понимания работы протокола и регулярном онлайне -никаких сюрпризов быть не должно. +OMEMO was designed as a set-it-and-forget-it solution, +and it mostly succeeds in that goal. +If you have a basic understanding of how the protocol works +and check in online from time to time, +there shouldn’t be any surprises. -Всё обслуживание заключается в регулярных бэкапах и -уведомлении своих контактов о фингерпринтах, -которые стоит добавить в список доверенных или убрать из него. -В нашем локальном хакспейсе мы даже проводим для этого регулярные события =) +All maintenance comes down to making regular backups +and notifying your contacts +when fingerprints are added or no longer valid +so they can keep their trust list up to date. -## Step-by-step guide +## Step-by-step Guide -Представим, что у меня есть аккаунт jid@some.server и несколько устройств: -телефон, ноутбук и настольный компьютер. -Сначала я опишу воркфлоу общими словами, -а потом дам уточнения про использование конкретных приложений. +Let’s say I have a XMPP account, me@some.server, +and a few devices: a phone, a laptop, and a desktop computer. +First I’ll describe my mindset at a high level, +then I’ll add some notes about specific clients. -Я предпочитаю следовать такому майндсету: -С одной стороны, -у меня есть мобильное устройство, -которое всегда со мной и практические всегда онлайн: -на нём я храню полную историю переписок и получаю уведомления в реальном -времени. -С другой стороны, у меня есть несколько десктопных приложений: -я открываю их только когда мне нужно обсудить что-нибудь с использованием -клавиатуры или копи-пастинга. -Мне нравится думать о них, как о приложениях-сателлитах. +### Client Roles + +On the one hand, I have my phone. +It’s almost always with me and almost always online. +That’s where I keep the full chat history and get real-time notifications. + +On the other hand, I have a couple of desktop applications. +I only open them when I need to discuss something using my keyboard +or move some text between devices. +I like to think of them as ad-hoc or satellite clients. ### Before the Start -Первым делом мне нужно сгенерировать на каждом устройстве приватные ключи. -Обычно это происходит автоматически. +First, enable OMEMO encryption on every client if it isn't enabled by default. +The client will usually generate the keys and fingerprint automatically. -Потом я должен на каждом своём устройстве добавить остальные: -телефон должен считать все мои компьютеры доверенными устройствами, -а компьютеры доверять друг другу и телефону. +The next step is to add all clients to the trust list on each device: +my phone should trust all my computers, +and my computers should trust each other as well as my phone. -Фингерпринты публичные, -их можно даже разместить у себя на какой-нибудь личной странице. -Вот, например, моя: https://oddsquat.org/about/keys/ +Fingerprints do not have to be secret, so they can be published on +your website or even on social media profiles. +Here is my page with the fingerprints: +https://oddsquat.org/about/keys/ ### Start the Conversation in Person -Предположим, я встретил Алису и мы решили обменяться контактами. -Я открыл на телефоне специальный QR-код, -затем Алиса считала его своим клиентом. -В этот QR-код уже зашиты фингерпринты всех моих устройств, так что -дополнительных действий не требуется. -Аналогично, я своим мобильным клиентом считываю QR-код с экрана Алисы. +Let’s say I meet Alice, +we start talking, and decide to continue the conversation online. -Теперь мы оба уверены, что в переписке будем участвовать именно мы, -а все наши сообщения будут доступны на всех наших устройствах и только на них. +I open a special QR code on my phone, and Alice scans it with her client. +This QR code already contains the fingerprints of all my devices, +so no extra steps are needed. + +Then I do the same and scan the QR code from Alice’s screen +with my mobile client. + +Now we are both sure that it’s really us in the conversation, +and that all messages will be available on all our devices and only on them. ### Start the Conversation Online -Предположим, что мы начали обсуждать что-то с Бобом где-то в сети -(на форуме, в федиверсе, не важно) и решили продолжить обсуждение в мессенджере. +Let’s say Bob and I start discussing something +on a forum or in the Fediverse, +and then decide to move to XMPP. -Боб инициирует переписку, я слепо доверяю первому устройству, -с которого он мне написал и уже потом мы обмениваемся в переписке -фингерпринтами остальных наших устройств, если они есть. -Такая стратегия называется ToFu. +Bob starts the chat. I trust the first device he messages me from, +and then we exchange fingerprints for our other devices, if we have any. +This approach is called TOFU (Trust On First Use). -Опять же Боб может убедиться, что я это я с помощью моей страницы с ключами, -а я могу убедиться, что Боб на форуме -- тот же самый Боб, попросив его -прислать мне фингерпринты прямо в личных сообщениях на том же самом форуме или -отдельно посредством email, например. +Bob can confirm it’s really me using my page with fingerprints. +I can confirm it’s really him by asking him to send his fingerprints +in a private message on the same forum or via email. -В идеальном случае, -у Боба тоже есть какая-то публичная страница с фингерпринтами. -Тогда мы оба можем независимо убедиться, -что мы именно те, за кого себя выдаём =) +Ideally, Bob also has a public page with his fingerprints. +That way, we can both independently verify +that we are who we say we are. ### New or Lost Devices -Если я решил начать использовать -какое-то новое устройство или установить куда-нибудь -ещё одно клиентское приложение, -то первым делом я должен добавить его в список доверенных клиентов -на остальных моих существующих устройствах. +If I start using a new device or install another client application, +the first thing I do is add it to the list of trusted clients +on my existing devices. -Если я по каким-либо причинам потеряю любое из своих устройств -или зачем-то удалю один из своих приватных ключей, -то первым делом я должен исключить такой клиент из списка доверенных -на остальных моих устройствах. +If I lose one of my devices or delete any private keys, +the first thing I do is remove the corresponding client +from the trusted list on my other devices. -После актуализации моих личных списков доверенных устройств -стоит сообщить об изменениях моим собеседникам по довереным каналам. -Я могу просто попросить Алису считать мой новый QR-код при следующей встрече, -а Бобу отправить сообщение о том, -что утраченому устройству доверять больше не стоит, -настоящих сообщений с него уже никогда не придёт. +Once I’ve updated all my personal lists, +I should inform my contacts about changes via trusted channels. + +I can simply ask Alice to scan my new QR code the next time we meet, +and send Bob a message introducing my new client or letting him know +that the lost device is no longer trusted +and that no real messages will ever come from it again. ## Client Applications -Этот раздел описывает особенности применения OMEMO для конкретных клиентов, -которыми я пользуюсь сам. +This section describes how OMEMO is used in specific client applications +that I personally use. -### Conversations, Monocles and Other Forks +### Conversations and Forks -Conversation - это современное полнофункциональное чат-приложение. -Оно поддерживает всё, что должно поддерживать: -переписки, звонки, отправку фотографий и файлов. -У него есть несколько форков, в которых UX может отличаться, -но core-фичи работают абсолютно одинаково. +Conversations is a modern, fully featured chat application for Android. +It supports everything a messaging app should support: +chats, voice calls, and sharing photos and files. -На экране с информацией о конакте (в том числе и о своём аккаунте) -можно увидеть список фингерпринтов, -вручную отметить галочкой доверенные или отозвать доверие. +There are several forks of it where the UI or UX may differ, +but the core features work exactly the same. +I personally use Monocles Chat. -Упростить все эти рутинные вещи призвана система с QR-кодами: -прямо на главном можно показать свой код или считать чужой. -Так верификация устройств при личной встрече становится простой и ненапряжной. +On the Contact Details screen (including your own account), +you can see a list of published fingerprints +and manually mark them as trusted or revoke trust. -Правило большого пальца - сканируй QR-код при каждом удобном случае. +To simplify all these routine operations, a QR-code-based system is used: +You can show your own QR code or scan other people’s codes +directly from the main screen. +This makes device verification during in-person meetings simple and effortless. ### Dino -Это лёгкий GUI-клиент, построенный на GTK фреймвоке. -Опять же, все вопросы доверия и недоверия -можно легко решить на экране "Детали контакта" с помощью чекбоксов. +Dino is a lightweight GTK-based GUI client. -К сожалению, по умолчанию, Dino настроен на автоматическое доверие -новым фингерпринтам, я рекомендую эту функцию отключить. +It can be considered a fully functional one, +although some non-essential features are still not supported or implemented. +For example, +it is not possible to clear local chat history using built-in methods :D + +Trust and untrust decisions can be easily managed +in the Encryption tab of the Conversation Details window. + +It is important to note that, by default, Dino is configured +to automatically trust new fingerprints. +I recommend disabling this feature. ### Profanity -Это могучий TUI-клиент, -где всё-всё-всё реализовано через встроенную систему команд. +Profanity is a powerful TUI client +where everything is controlled through a built-in command system. -Если вы зачем-то намерены им пользоваться, -то ниже вас ожидает небольшой читшит по использованию OMEMO, -но я настойчиво рекомендую ознакомиться с полной документацией самостоятельно. +If you somehow intend to use it, +below you will find a small cheat sheet for using OMEMO. +However, I strongly recommend reading the full documentation. -- Генерация ключа и добавление своих устройств: +- Generate a key and add your other clients: ```text /omemo gen /omemo trust me@some.server some-cool-fingerprint-01 @@ -356,26 +349,26 @@ Conversation - это современное полнофункциональн /omemo qrcode ``` -- Увидеть список своих или чужих fingerprint'ов: +- View the list of your own or someone else’s fingerprints: ```text /omemo fingerprint me@some.server /omemo fingerprint alice@another.server ``` - Доверенные будут помечены как `trusted`. + Trusted ones will be marked as `trusted`. -- Начать зашифрованный диалог: +- Start an encrypted conversation: ```text /omemo start alice@another.server ``` -- Добавить чужой фингерпринт в список доверенных: +- Add fingerprints to the trusted list: ```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 ``` -- Перестать доверять кокретному клиенту: +- Revoke trust for a specific client: ```text /omemo untrust alice@another.server some-cool-fingerprint-02 ```