diff --git a/src/pages/posts/2026/encrypted_XMPP.md b/src/pages/posts/2026/encrypted_XMPP.md index 12b8e71..40e199e 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 the time, the proprietary messenger kept making life harder +At that time, the proprietary messenger once again made 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**, 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. +Хочу также отметить, +что я буду использовать слово Client для обозначения конкретных инстансов +приложений на пользовательских устройствах. В документации, связанной с OMEMO +для этого использвется термин Device, но мне он кажется запутывающим: +в реальности на одном устройстве может быть несколько независимых клиентов. ## Basic Concepts -This section introduces some basic ideas behind end-to-end encryption. +Here I'm going to explain some basic ideas behind e2e. -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. +Если основные концепции и терминология вам знакомы, +то можете смело пропустить этот раздел +и перейти к особенностям их практического применения касательно XMPP. + +Или даже сразу перейти к описанию workflow, которого я придерживаюсь сам. ### Trade-offs Between Safety and Convenience @@ -108,240 +108,247 @@ is actually based on XMPP, but incompatibly altered and defederated. ### Keys, Fingerprints and Trust -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. +OMEMO построен вокруг Double Ratchet Algorithm. +Там внутри всё очень интересно, +но нам для практического применения важно только то, +что каждый клиент пользователя хранит в себе какие-то там ключи, +и умеет получать из них какой-то там хэш, +который принято называть fingerprint. -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. +Ключи обычно как-то автоматически управляются XMPP клиентом +и в норме вам никогда не стоит трогать их руками. +Возможно, вам лучше даже и не знать, как они выглядят. +Единственное, что с ними нужно делать -- +держать в секрете и бэкапить при необходимости. -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. +Фингерпринт позволяет отличать конкретный +клиент собеседника и быть уверенным, что его не подмененили. +Список фингерпринтов для конкретного аккаунта +не является чем-то секретным: +клиентские приложения сами анонсируют свои фингерпнинты на сервере +и автоматически пополняют список чужих. +Значение имеют только те, +которые вы пометили как фингерпринты довереных клиентов. -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. +В идеале, человек должен лично при встрече +или по уже довереному и безопасному каналу связи +сказать вам "Да, фингерпринт XXX принадлежит моему устройству" +и только после этого вы помечаете XXX доверенным. +Обычно в интерфейсе это просто проставление чекбокса или сканирование QR-кода. -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. +Некоторые клиенты для удобства пользователя +довериют любым новым фингерпринтам контактов по-умолчанию, +но я не стал бы рекомендовать использовать такую политику, +это легкомысленно и небезопасно. +Политики доверия или недоверия +можно посмотреть или поменять в настройках вашего клиента. -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 творит какую-то магию с жонглированием ключами и +ни один клиент, кроме перечисленных в списке на момент зашифровки, +не сможет его впоследствии расшифровать. +Передать как-то доверие в прошлое, увы, невозможно. -## Practical Aspects of OMEMO and XMPP +## Реалии OMEMO и XMPP +## Особенности OMEMO и XMPP ### Chat History -In theory, XMPP supports server-side message history storage via -**XEP-0313: Message Archive Management**. +Вообще, XMPP поддерживает хранение истории переписок на сервере. +За это отвечает **XEP-0313: Message Archive Management**. -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. +В реальности поддержка этого XEP, +политика хранения истории и особенно сроки хранения сообщений +зависят от конкретного сервера. +Рассчитывать по-умолчанию на бессрочное хранение всех переписок не стоит. -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. +В конечном счёте, +ответственность за хранение переписок лежит исключительно на вас +и это разумное место для применения local-first подхода. +С практической точки зрения +проще всего рассматривать серверный архив сообщений +как некоторый кэш, который выручит вас по возвращении +из непродолжительного офлайна +или поможет с синхронизацей текущей переписки между разными устройствами. ### 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 +До его внедрения можно было переключиться с телефона на лэптоп +и пялиться в загруженную историю переписки, +состоящей только из входящих сообщений от собеседника. +Отправка своих же сообщений ещё и самому себе +на уровне протокола -- это довольно неочевидная фича. -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. +Тут важно упомянуть, что при использовании e2e шифрования, +упомянутая выше концепция доверенных отпечатков пальцев +распространяется и на свои клиенты тоже. -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. +Для бесшовной синхронизации исходящих сообщений +все ваши клиенты должны считать фингерпринты друг друга доверенными, +иначе можно столкнуться с ситуацией, +когда не получается прочитать своё же сообщение. + +Логичное, но неприятное следствие: +Новый клиент или старый, +который не был в списке доверенных на момент отправки сообщений, +получит историю из MAM, но не сможет её расшифровать. +Да, даже ваши сообщения. +Теоретически, перепаковка сообщений +на старых доверенных клиентах вроде как возможна, +но на практике, никто такое пока не имплементировал +и важные вещи придётся пересылать вручную. ### 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 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. +OMEMO был задуман как решение, которое после настройки не требует какого-то +дополнительного вмешательства. +Можно считать, что этой заявленной цели удалось достичь +и при наличии базового понимания работы протокола и регулярном онлайне +никаких сюрпризов быть не должно. -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 -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. +Представим, что у меня есть аккаунт jid@some.server и несколько устройств: +телефон, ноутбук и настольный компьютер. +Сначала я опишу воркфлоу общими словами, +а потом дам уточнения про использование конкретных приложений. -### 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. +Потом я должен на каждом своём устройстве добавить остальные: +телефон должен считать все мои компьютеры доверенными устройствами, +а компьютеры доверять друг другу и телефону. -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/ +Фингерпринты публичные, +их можно даже разместить у себя на какой-нибудь личной странице. +Вот, например, моя: https://oddsquat.org/about/keys/ ### Start the Conversation in Person -Let’s say I meet Alice, -we start talking, and decide to continue the conversation online. +Предположим, я встретил Алису и мы решили обменяться контактами. +Я открыл на телефоне специальный QR-код, +затем Алиса считала его своим клиентом. +В этот QR-код уже зашиты фингерпринты всех моих устройств, так что +дополнительных действий не требуется. +Аналогично, я своим мобильным клиентом считываю QR-код с экрана Алисы. -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. +Предположим, что мы начали обсуждать что-то с Бобом где-то в сети +(на форуме, в федиверсе, не важно) и решили продолжить обсуждение в мессенджере. -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). +Боб инициирует переписку, я слепо доверяю первому устройству, +с которого он мне написал и уже потом мы обмениваемся в переписке +фингерпринтами остальных наших устройств, если они есть. +Такая стратегия называется ToFu. -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. +Опять же Боб может убедиться, что я это я с помощью моей страницы с ключами, +а я могу убедиться, что Боб на форуме -- тот же самый Боб, попросив его +прислать мне фингерпринты прямо в личных сообщениях на том же самом форуме или +отдельно посредством 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. +Если я по каким-либо причинам потеряю любое из своих устройств +или зачем-то удалю один из своих приватных ключей, +то первым делом я должен исключить такой клиент из списка доверенных +на остальных моих устройствах. -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. +После актуализации моих личных списков доверенных устройств +стоит сообщить об изменениях моим собеседникам по довереным каналам. +Я могу просто попросить Алису считать мой новый QR-код при следующей встрече, +а Бобу отправить сообщение о том, +что утраченому устройству доверять больше не стоит, +настоящих сообщений с него уже никогда не придёт. ## Client Applications -This section describes how OMEMO is used in specific client applications -that I personally use. +Этот раздел описывает особенности применения OMEMO для конкретных клиентов, +которыми я пользуюсь сам. -### Conversations and Forks +### Conversations, Monocles and Other Forks -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. +Conversation - это современное полнофункциональное чат-приложение. +Оно поддерживает всё, что должно поддерживать: +переписки, звонки, отправку фотографий и файлов. +У него есть несколько форков, в которых UX может отличаться, +но core-фичи работают абсолютно одинаково. -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. +На экране с информацией о конакте (в том числе и о своём аккаунте) +можно увидеть список фингерпринтов, +вручную отметить галочкой доверенные или отозвать доверие. -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. +Правило большого пальца - сканируй QR-код при каждом удобном случае. ### Dino -Dino is a lightweight GTK-based GUI client. +Это лёгкий GUI-клиент, построенный на GTK фреймвоке. +Опять же, все вопросы доверия и недоверия +можно легко решить на экране "Детали контакта" с помощью чекбоксов. -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. +К сожалению, по умолчанию, Dino настроен на автоматическое доверие +новым фингерпринтам, я рекомендую эту функцию отключить. ### Profanity -Profanity is a powerful TUI client -where everything is controlled through a built-in command system. +Это могучий TUI-клиент, +где всё-всё-всё реализовано через встроенную систему команд. -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. +Если вы зачем-то намерены им пользоваться, +то ниже вас ожидает небольшой читшит по использованию OMEMO, +но я настойчиво рекомендую ознакомиться с полной документацией самостоятельно. -- Generate a key and add your other clients: +- Генерация ключа и добавление своих устройств: ```text /omemo gen /omemo trust me@some.server some-cool-fingerprint-01 @@ -349,26 +356,26 @@ However, I strongly recommend reading the full documentation. /omemo qrcode ``` -- View the list of your own or someone else’s fingerprints: +- Увидеть список своих или чужих fingerprint'ов: ```text /omemo fingerprint me@some.server /omemo fingerprint alice@another.server ``` - Trusted ones will be marked as `trusted`. + Доверенные будут помечены как `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 ```