О шифровании в Jabber

«Трое могут хранить секрет, если двое из них мертвы»
— Бенджамин Франклин

Основная информация

В начале в XMPP широко использовались две основные схемы сквозного шифрования: обмен сообщениями Off-the-Record (OTR) (Current Off-the-Record Messaging Usage (XEP-0364)) и OpenPGP (Current Использование Jabber OpenPGP (XEP-0027)). Старые версии OTR имели существенные недостатки удобства использования для межклиентской мобильности. Поскольку сеансы OTR существовали ровно между двумя клиентами, история чата не синхронизировалась между другими клиентами вовлеченных сторон. Кроме того, чаты OTR были возможны только в том случае, если оба участника были в сети одновременно, из-за того, как работала схема соглашения с изменяющимся ключом OTR. Некоторые из этих проблем были решены в OTRv4. OpenPGP, хотя и не страдает от этих проблем с мобильностью, не обеспечивает никакой прямой секретности и уязвим для атак воспроизведения. Кроме того, PGP поверх XMPP использует пользовательский формат связей, который определяется соглашением, а не стандартизацией, и включает в себя довольно много внешних сложностей. Проблемы с форматом связей были решены с помощью OpenPGP для XMPP (XEP-0373)

Jabber обладает широкими возможностями в области шифрования. Для обеспечения безопасного подключения к серверу, а также для сохранения конфиденциальности разговоров в сети Jabber используются разнообразные системы шифрования. Ниже рассмотрены самые распространенные.

Что такое сертификат безопасности

  • Для безопасной передачи пароля при подключении используется механизм SASL. Суть его действия заключается в том, что сам пароль фактически не передается по каналу связи, поэтому получить его недоброжелателю в этом случае крайне тяжело. Этот механизм включен по умолчанию практически во всех клиентах, поэтому вам не требуется совершать какие-либо действия для его включения.
  • Для шифрования самих сообщений используются протоколы TLS и SSL. Благодаря этим технологиям, злоумышленнику будет значительно тяжелее перехватить вашу переписку. Эти протоколы очень похожи между собой, но TLS считается немного более современным. В большинстве клиентов для компьютеров TLS или SSL включены по умолчанию, а в клиентах для мобильных устройств требуется включить эту опцию в настройках. При желании вы можете добавить сертификат из доверенного источника в ваш клиент — это повысит безопасность. Крайне важно отметить, что при использовании TLS или SSL Jabber-сервер производит расшифровку сообщений, поэтому администратор сервера имеет полный доступ к вашей переписке.
  • Если вы не доверяете своему серверу, то вам необходимо использовать E2E-шифрование: OTR, OMEMO или GPG. Первые два не требуют особых усилий для их использования, GPG же нуждается в некоторой настройке, но дает максимально возможную для Jabber степень безопасности.

Шифрование OMEMO

OMEMO (XEP-0384) — это расширение для открытого протокола XMPP, которое реализует сквозное шифрование для нескольких клиентов. OMEMO было разработано Андреасом Штраубом (Andreas Straub). OMEMO использует Olm, реализацию протокола Signal, для обмена ключами и для синхронизации сообщений между несколькими клиентами, даже если некоторые из них отключены. Имя OMEMO это рекурсивный акроним для «OMEMO Multi-End Message and Object Encryption» (OMEMO многоконечные сообщения и шифрование объектов). OMEMO кроме того базируется на протоколе Personal Eventing Protocol (PEP, XEP-0163) и предоставляет совершенную прямую секретность (Perfect Forward Secrecy) и правдоподобное отрицание (англ. plausible deniability).Самый распространенный способ шифрования для мессенджеров, OTR, тоже поддерживает совершенную прямую секретность и правдоподобное отрицание, но требует чтобы все участники были в сети. OpenPGP поддерживает офлайн сообщения, но не предоставляет прямую конфиденциальность и правдоподобие. Olm и, соответственно, OMEMO поддерживают все три требования.

Кроме того, существующие решения шифрования мессенджеров, такие как OTR, подвергались критике за отсутствие в них интеграции XMPP. Разработчики Empathy, официальный мессенджер оболочки Gnome, указали это как причину из-за которой эта часто желаемая функция не была встроена. Благодаря интеграции в чат протоколы, OMEMO является улучшением в этом отношении.

Поддержка клиентов

  • ChatSecure (iOS)
  • Conversations (Android)
  • Cryptocat (Linux, macOS, Windows; этот клиент использует вариант XMPP и поэтому совместим только с серверами Cryptocat)
  • Dino (Linux)
  • Gajim посредством официального расширения (Linux, Windows, BSD)
  • Psi посредством официального расширения (Linux, Windows, macOS)
  • Psi+ посредством официального расширения (Linux, Windows, macOS,Haiku, FreeBSD) Profanity посредством экспериментальных расширений (BSD, Linux, Windows)
  • Pidgin и другие клиенты на базе libpurple посредством экспериментальных расширений
  • Siskin (iOS)
  • Zom (Android, iOS)

OMEMO использует Double Ratchet для установления безопасных сеансов между каждой комбинацией устройств для вас и вашего контакта. Эти сеансы затем используются для передачи безопасных ключей всем устройствам. OMEMO будет генерировать новый ключ для каждого сообщения. Этот ключ используется для шифрования вашего сообщения с помощью AES-GCM. Долгоживущие сеансы Double Ratchet в фоновом режиме решают проблемы изменения порядка сообщений, их потери и случайного дублирования.

Основанный на PEP (Personal Eventing Protocol) для объявления предварительных ключей, используемых Double Ratchet для установления новых сеансов, OMEMO практически не требует изменений в существующей инфраструктуре сервера XMPP.

Сообщение зашифровано с использованием OMEMO:

<message xmlns='jabber:client'
xml:lang='en'
to='alisa@example.com'
from='bob@example.com/Resurse'
type='chat'
id='6ebb0baa-701d-4a6b-8441-a1490b9fc289'>
<encrypted xmlns='eu.siacs.conversations.axolotl'>
<header sid='457828257'>
<key rid='225217758'>MwohBZ1PYamsOrG2XdgeD506nQ46/liPr1SrD94Ox7LFERIYEAAYACIwcbP/00Sy+ps0FtNdIrY2U9tpoMsypxRsU/5Y8ECsLqJ8dBpDh5YD09I4FjYgzE3HLeIOjzKGjAg=</key>
<iv>MwwMESlcjY6nLZ6+</iv>
</header>
<payload>LtJNY5vWpDX8TIrnlWslwT8XQG8aWtlmvuLdcdG4zJP/uDdOJEHum5Cad1534/78S9chK5JD3Ry9daSYbmGK3GywUHlCDgn4VwO6LGaUHuoR1hTKWNS5kIP2zKyq69PmLg==</payload>
</encrypted>
<request xmlns='urn:xmpp:receipts' />
<markable xmlns='urn:xmpp:chat-markers:0' />
<origin-id xmlns='urn:xmpp:sid:0'
id='6ebb0baa-701d-4a6b-8441-a1490b9fc289' />
<store xmlns='urn:xmpp:hints' />
<encryption xmlns='urn:xmpp:eme:0'
name='OMEMO'
namespace='eu.siacs.conversations.axolotl' />
<active xmlns='http://jabber.org/protocol/chatstates' />
<delay xmlns='urn:xmpp:delay'
from='example.com'
stamp='2000-01-31T11:50:13.925887Z'>Offline Storage</delay>
<body>
I sent you an OMEMO encrypted message but your client doesn’t seem to support that. Find more information on https://conversations.im/omemo
</body>
</message>

Шифрование PGP (OpenPGP, GPG)

OpenPGP — наиболее широко используемый стандарт шифрования электронной почты. Он определен рабочей группой OpenPGP Инженерной рабочей группы Интернета (IETF) как предлагаемый стандарт в RFC 4880. OpenPGP изначально был производным от программного обеспечения PGP, созданного Филом Циммерманном.

Защищеннось

В 1996 году криптограф Брюс Шнайер охарактеризовал раннюю версию PGP как «ближайшую к криптосистемам военного уровня». На данный момент не известно ни одного случая взлома данных, зашифрованных PGP, при помощи полного перебора или уязвимости криптоалгоритма.

Криптографическая стойкость PGP основана на предположении, что используемые алгоритмы устойчивы к криптоанализу на современном оборудовании. Например, в PGP первых версий для шифрования ключей сессии использовался алгоритм RSA, основанный на односторонней функции (факторизация). В PGP версии 2 дополнительно можно использовать алгоритм IDEA. В последующем были добавлены дополнительные алгоритмы шифрования. Ни у одного используемого алгоритма нет известных уязвимостей.

В 2010 году группе учёных из Швейцарии, Японии, Франции, Нидерландов, Германии и США удалось разложить на множители 768-битный 232-значный RSA-ключ. Нахождение простых сомножителей осуществлялось общим методом решета числового поля[6]. На первый шаг (выбор пары полиномов степени 6 и 1) было потрачено около полугода вычислений на 80 процессорах, что составило около 3 % времени, потраченного на главный этап алгоритма (просеивание), который выполнялся на сотнях компьютеров в течение почти двух лет. Если интерполировать это время на работу одного процессора AMD Opteron 2,2 ГГц с 2 ГБ оперативной памяти, то получилось бы порядка 1500 лет. Обработка данных после просеивания для следующего ресурсоёмкого шага (линейной алгебры) потребовала несколько недель на малом количестве процессоров. Заключительный шаг после нахождения нетривиальных решений ОСЛУ занял не более 12 часов.

Решение ОСЛУ проводилось с помощью метода Видемана на нескольких раздельных кластерах и длилось чуть менее 4 месяцев. При этом размер разрежённой матрицы составил 192 796 550×192 795 550 при наличии 27 795 115 920 ненулевых элементов. Для хранения матрицы на жёстком диске понадобилось около 105 гигабайт. В то же время понадобилось около 5 терабайт сжатых данных для построения данной матрицы.

В итоге группе удалось вычислить оба простых сомножителя, каждый из которых является 384-битным 116-значным числом.

Исследователи уверены, что с использованием их метода факторизации взломать 1024-битный RSA-ключ будет возможно в течение следующего десятилетия.

OpenPGP (XEP-0027) — это метод шифрования, который имеет некоторые преимущества по сравнению с OMEMO, но его следует использовать только тем, кто знает, что делает.

Сообщение зашифровано с использованием PGP:

<message xmlns='jabber:client'
xml:lang='en'
to='alisa@example.com'
from='bob@example.com/resurse'
type='chat'
id='fcaab928-a26c-4a2e-8a4a-54b240374bf9'>
"<"request xmlns='urn:xmpp:receipts'/">"
<markable xmlns='urn:xmpp:chat-markers:0' />
<origin-id xmlns='urn:xmpp:sid:0'
id='fcaab928-a26c-4a2e-8a4a-54b240374bf9' />
<x xmlns='jabber:x:encrypted'>hJ4Df8Imr++6PZ0SAwMEGIqutCO/Afw1zWgLqG2Ankh8TOjVEtq+jia4ir9r2c/e
  6ziH5UJapUjEs/ma08JOLTQKzgyNZ8sgjh4j7v2kw6U1RwfrlJjlh4lj4Qn6X48s
  ngBwA/dwEK2q/zGldjpJMBC5Nj7mfNDNKKfgRLGw4eVMlSSZQaYRRgUPZfRIBW8m
  1/N6EMojD+saT7M/5nn8tYR+A8rKmXMQ5ZaEEgIDBEqnXC6u2tanlGYDekHG/okM
  FXFTOyRqBHyKuebZbP/LESG+VNgDstDOoTY9JoOSz9H07SS/nktFZxQ+PEjT1r8w
  k1MOIotIui2vGglXjzxqm9SUQRh/LeTpOtyrly4dwi0vsU8EVWP4kkf2UagqekQw
  0o0BlAstaf3FlVU6dQ4lNINhQ/C/LjuO5VttWcHJnuuAAuOKk3FUbPf4EX2Jmc0g
  PLRWD8i62q6HkHkA4mmqodlQQx4x2o7+rItuQtWN7s8KRKZlso1tespYbuiBOlFQ
  THnwrie+NGIvoXetoGc+iL0YxqtxuNbNnjlasj6Yjs2NZoY298gYRDZw1MhJcsQ=
  =cbWc</x>
<encryption xmlns='urn:xmpp:eme:0'
namespace='jabber:x:encrypted' />
<active xmlns='http://jabber.org/protocol/chatstates' />
<delay xmlns='urn:xmpp:delay'
from='berkut.im'
stamp='2000-02-31T11:13:11.450318Z'>Offline Storage</delay>
<body>
I sent you a PGP encrypted message but your client doesn’t seem to support that.
</body>
</message>

Что случилось с поддержкой OTR?

OTR был удален, поскольку он был крайне ненадежен. Он не работал с несколькими устройствами и никогда не был указан для работы с XMPP. Кодовая база была в беспорядке (там был синтаксический анализатор HTML, который громко кричал, чтобы справиться с мусором, который присылали некоторые клиенты OTR). Проверка была реализована неблокирующим способом. Он сообщит вам, использовал ли текущий сеанс неизвестный отпечаток пальца, но не остановит вас от отправки сообщений, пока вы не подтвердите новый отпечаток пальца. (То же самое, что диалоги сделали бы сейчас с BTBV после проверки или когда BTBV отключен.) Учитывая предыдущие пункты, с моей точки зрения практически не было желания исправить эту потенциальную проблему безопасности или очистить кодовую базу. Другая причина удаления заключалась в том, что люди могли случайно использовать его даже для связи между двумя клиентами, потому что они где-то читали, что OTR — это хорошо.