Compare commits

..

11 commits

View file

@ -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.
Thats when I realized that I prefer protocols over services.
@ -50,21 +50,21 @@ it on a&nbsp;<a
href='https://contrapunctus.codeberg.page/the-quick-and-easy-guide-to-xmpp.html'
target='_blank'>dedicated page by Daniel Gultsch</a>.
Хочу также отметить,
что я буду использовать слово Client для обозначения конкретных инстансов
приложений на пользовательских устройствах. В документации, связанной с OMEMO
для этого использвется термин Device, но мне он кажется запутывающим:
в реальности на одном устройстве может быть несколько независимых клиентов.
**Client**, in this post,
means a specific instance of an XMPP application on a user device.
<br>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&nbsp;<a
href='#'>how end-to-end encryption affects the XMPP user experience</a>
or jump straight to the <a
href='#'>step-by-step workflow</a>&nbsp;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 dont even need to know what they look like.
Фингерпринт позволяет отличать конкретный
клиент собеседника и быть уверенным, что его не подмененили.
Список фингерпринтов для конкретного аккаунта
не является чем-то секретным:
клиентские приложения сами анонсируют свои фингерпнинты на сервере
и автоматически пополняют список чужих.
Значение имеют только те,
которые вы пометили как фингерпринты довереных клиентов.
A fingerprint lets you identify a specific client of your contact
and verify that it hasnt 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.
<br>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
Тут же стоит отметить, что такие простые и понятные на первый взгляд фичи
как редактирование и удаление сообщений вообще-то полагаются на
клиентский код и могут не сработать у вашего собеседника так,
как вы этого ожидаете.
Ими можно пользоваться,
это удобно и некоторые клиенты их отлично поддерживают,
но полагаться на них для сокрытия чего-либо не стоит.
Its 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.
Theyre fine to use and are well supported in some clients,
but you shouldnt 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 shouldnt 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 и несколько устройств:
телефон, ноутбук и настольный компьютер.
Сначала я опишу воркфлоу общими словами,
а потом дам уточнения про использование конкретных приложений.
Lets say I have a XMPP account, me@some.server,
and a few devices: a phone, a laptop, and a desktop computer.
First Ill describe my mindset at a high level,
then Ill add some notes about specific clients.
Я предпочитаю следовать такому майндсету:
С одной стороны,
у меня есть мобильное устройство,
которое всегда со мной и практические всегда онлайн:
на нём я храню полную историю переписок и получаю уведомления в реальном
времени.
С другой стороны, у меня есть несколько десктопных приложений:
я открываю их только когда мне нужно обсудить что-нибудь с использованием
клавиатуры или копи-пастинга.
Мне нравится думать о них, как о приложениях-сателлитах.
### Client Roles
On the one hand, I have my phone.
Its almost always with me and almost always online.
Thats 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-код с экрана Алисы.
Lets 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 Alices screen
with my mobile client.
Now we are both sure that its really us in the conversation,
and that all messages will be available on all our devices and only on them.
### Start the Conversation Online
Предположим, что мы начали обсуждать что-то с Бобом где-то в сети
(на форуме, в федиверсе, не важно) и решили продолжить обсуждение в мессенджере.
Lets 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 its really me using my page with fingerprints.
I can confirm its 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 Ive 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 peoples 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 elses 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
```