9 августа 2024 года Роскомнадзор ограничил доступ к мессенджеру Signal, у которого репутация одного из самых защищённых и конфиденциальных мессенджеров. Мы решили разобраться, как там всё устроено внутри, какие алгоритмы используются и так ли это безопасно на самом деле.
Что за мессенджер Signal
Мессенджер Signal появился ещё в 2014 году — тогда он назывался TextSecure. Общаться в Signal можно так же, как в любом другом современном мессенджере: переписываться, отправлять изображения, видео и другие файлы, созваниваться голосом или по видеосвязи и создавать группы для одновременного общения нескольких человек.
Работает это всё так, что все сообщения и звонки защищены и в теории никто, кроме пользователя и его собеседников, не может их прочитать или прослушать. Даже сам Signal, который собирает о пользователях минимальный объём данных и хранит их. К примеру, в 2021 году на запрос американских правоохранительных органов Signal смог предоставить только информацию о дате создания аккаунта и последней дате, когда пользователь подключился к серверу.
Эта ситуация укрепила репутацию Signal как мессенджера, который крайне серьёзно относится к безопасности и конфиденциальности. В то же время правительства многих стран начали выражать беспокойство из-за того, что Signal можно использовать для незаконных действий.
Разработкой и поддержкой Signal занимается некоммерческий фонд Signal Foundation, который существует за счёт инвестиций и пожертвований. На практике это означает, что работу Signal сложно регулировать со стороны.
Сейчас доступ к Signal на территории России ограничен, но не запрещён, поэтому мессенджером можно пользоваться. Ограничен — это значит, что стандартные способы подключения, которые работали раньше, сейчас не работают. Он также не входит в список экстремистских ресурсов, поэтому о нём рассказывать можно. Если что-то в этом плане поменяется, мы обновим статью.
Signal и открытый исходный код
Приложение Signal есть для всех десктопных и мобильных операционных систем. Код для каждой платформы выложен на GitHub. Любой может проверить, как устроен Signal, и убедиться, что в нём нет скрытых ловушек или уязвимостей. Основные языки, на которых написано приложение, — Java и Swift.
На Гитхабе можно посмотреть папки, модули, даты последних изменений и сообщения в коммитах:
Например, совсем недавно в модуле AppLaunch поменялось что-то про криптографию. Нажимаем на название коммита и видим список всех файлов и внесённых изменений:
Скопируем текст об изменениях в одном из коммитов, название файла и код и попросим ChatGPT их объяснить. Получаем такой ответ — не очень информативный, конечно, но основное понять можно:
Если разбирать так весь код, это займёт много времени. Но для базового понимания достаточно 2–3 часов. Пока специалисты по кибербезопасности не нашли в исходном коде каких-либо закладок, которые поставили бы под сомнение надёжность алгоритмов шифрования в Signal.
Как работают современные популярные протоколы шифрования на примере алгоритма Диффи — Хеллмана
В мессенджерах используется сквозное шифрование с открытыми и секретными ключами. Их видят все, но шифрование E2E не позволяет использовать эти данные для взлома переписки. E2E — это сокращение от End to end, то есть шифрование и расшифровка происходят на конечных устройствах пользователей, а не на сервере.
Упрощённо это работает так:
- Алла и Борис хотят обмениваться сообщениями.
- У каждого из них есть пара ключей: секретный и открытый.
- Приложение Аллы посылает свой публичный ключ на сервер, оттуда его забирает приложение Бориса и смешивает со своим секретным ключом.
- Для смешивания ключи добавляются в сложную математическую функцию. В результате вычисления этой функции получается ключ сессии.
- Приложение Бориса шифрует своё сообщение ключом сессии и отправляет его приложению Аллы, прикладывая свой публичный ключ.
- Приложение Аллы смешивает свой секретный ключ и публичный ключ приложения Бориса и получает ключ сессии, который может расшифровать сообщение.
На этом месте остановимся немного подробнее. Публичные и секретные ключи приложения Аллы и приложения Бориса не повторяются, и всё же при перекрёстном перемешивании дают один и тот же результат. Это работает потому, что смешивание происходит по специальной математической схеме, алгоритму Диффи — Хеллмана:
Для алгоритма берутся два числа, и по ним вычисляется третье. Это третье число будет одинаковым для любого количества участников, у которых есть секретные ключи. Главная идея тут в том, что, зная это третье число, нельзя понять, из каких двух чисел оно получилось. На этом подходе строится большинство современных алгоритмов такого шифрования, а надёжность такого шифрования строится на гипотезе, что для некоторых задач нет простого решения.
Например, если взять какое-то очень большое число, то не получится за разумное время найти простые множители этого числа, которые как раз и могут быть исходными ключами для обеих сторон. Поэтому, если у вас есть секретное большое число, вы можете перемножить его с другим и показать результат всем — но исходные числа нельзя вычислить меньше чем за сотни или даже тысячи лет.
Алгоритм Диффи — Хеллмана строится так же: у нас есть секретный ключ и открытый. Для шифрования в мессенджерах мы их не просто перемножаем, а используем сложные математические функции. И в итоге получаем ключ для сеанса связи, который нельзя раскрыть без знания секретного ключа.
Тройной алгоритм Диффи — Хеллмана в Signal
Обычный алгоритм Диффи — Хеллмана синхронный: он работает, если оба пользователя будут онлайн. Но мессенджеры работают асинхронно: один участник разговора написал, второй ответил через несколько часов или дней. Чтобы поддерживать эту возможность, в Signal Protocol реализован тройной алгоритм Диффи — Хеллмана (X3DH).
Для этого Борису нужны 3 пары ключей. В каждой паре есть секретная и открытая часть:
- Ключи идентификации (identity key). Это ключи, которые помогают подтвердить личность Бориса. Они привязаны к аккаунту и не меняются — только если Борис потеряет доступ к учётной записи и создаст другой аккаунт.
- Предварительные ключи (signed prekey). Нужны для начала разговора, если Борис не в сети. Такие ключи создаются на основе постоянного и периодически обновляются. Вместе с предварительными ключами на сервере хранится электронная подпись для проверки их подлинности.
- Одноразовые ключи (one-time prekey). Используются только один раз для начала первого диалога с каждым новым контактом в мессенджере. Сразу после использования Аллой публичного одноразового ключа Борис удаляет со своего устройства и с сервера соответствующий секретный ключ.
Чтобы начать переписываться с Борисом, у Аллы будут такие ключи:
- Ключи идентификации — постоянные ключи. Как у Бориса, только для Аллы.
- Временные ключи — одноразовые ключи, генерируются для каждого сообщения.
Алла скачивает с сервера ключи Бориса. После этого её приложение генерирует секретные числа по алгоритму Диффи — Хеллмана. В этом процессе участвуют такие пары ключей:
- Идентификационный ключ Аллы + предварительный ключ Бориса.
- Временный ключ Аллы + идентификационный ключ Бориса.
- Временный ключ Аллы + предварительный ключ Бориса.
- Временный ключ Аллы + одноразовый ключ Бориса. Это число высчитывается только в том случае, если у Бориса ещё остались на сервере неиспользованные одноразовые ключи.
Эти четыре Диффи-Хеллман-числа связаны между собой по такой схеме — последняя линия показана пунктиром, потому что её может и не быть:
Когда Алла получает все секретные числа, мессенджер генерирует из них одно: ключ сессии, которым шифруется только одно сообщение. Процесс получения этого ключа называется «функция получения ключа» (key derivation function) и чаще всего обозначается на схемах как KDF:
Когда Алла получила ключ сессии, она шифрует начальное сообщение и отправляет его Борису вместе с открытыми частями пар ключей: своим ключом идентификации и временным ключом.
Если Алла использовала один из одноразовых ключей Бориса, она прикладывает его номер, чтобы Борис понимал, какой ключ нужно использовать в вычислениях.
Теперь у Бориса есть все данные, чтобы повторить вычисления Аллы со своими секретными ключами.
Алгоритм Диффи — Хеллмана устроен так, что Борис использует свои ключи, но результат должен быть тот же самый, что у Аллы. Поэтому, если после всех вычислений итоговый ключ сессии не расшифровывает начальное сообщение, Борис прерывает протокол и удаляет ключ сессии. Если сообщение расшифровывается, Борис может продолжать общаться с Аллой.
Постквантовый алгоритм шифрования PQXDH
Криптографы всего мира последнее время всё чаще беспокоятся о том, что с развитием квантовых вычислений и с появлением квантовых устройств достаточной мощности все текущие алгоритмы шифрования будут расшифрованы за очень короткое время — от нескольких минут до пары дней. Никто не может сказать, когда это случится — завтра или через 200 лет, но как только появятся такие устройства, все старые алгоритмы шифрования сразу станут ненадёжными.
Чтобы подстраховаться от появления таких квантовых устройств, разработчики Signal добавили в мессенджер алгоритм постквантового расширенного протокола Диффи — Хеллмана: PQXDH (Post-Quantum Extended Diffie-Hellman). Логика в том, чтобы заранее усложнить жизнь дешифровщикам, которые будут использовать квантовые технологии. Для этого в алгоритм добавляется ещё один слой вычислений, к которому трудно подобрать решение даже на квантовых компьютерах.
В общих чертах PQXDH работает так:
- Для шифрования используются сразу два протокола: Диффи — Хеллмана и постквантовый KEM-протокол Crystals Kyber-1024. KEM (key encapsulation mechanism) — это постквантовая схема выработки общего ключа, который нужен для обмена сообщениями.
- Два протокола создают каждый свой ключ — по своим алгоритмам и независимо друг от друга.
- Эти ключи используются для создания финального ключа шифрования, которым и будет защищены все сообщения в сессии.
Получается, что для взлома переписки злоумышленнику необходимо будет взломать сразу два ключа — обычный и постквантовый. Сейчас это выглядит как перебор (потому что даже обычный взломать быстро не получится), но как задел на квантовое будущее — вполне.
Действительно ли Signal — безопасный мессенджер
И да, и нет.
Да, потому что в нём используются действительно передовые технологии шифрования, которые действительно могут обеспечить защиту переписки в условиях перехвата сообщений.
Нет, потому что полной безопасности в интернете не существует. Даже открытый код Signal не даёт гарантии, потому что нельзя сказать точно, что приложение использует именно этот код.
А ещё Такер Карлсон недавно обвинил спецслужбы в том, что они просматривали его переписку в Signal и использовали данные оттуда для давления на него. Что там произошло на самом деле, мы не знаем, но повод подумать есть.
Пользоваться Signal или нет — в любом случае каждый решает сам. Мы же всегда исходим из того, что полной приватности в интернете не существует.
Есть ещё одна угроза почти для всей криптографии — недоказанная гипотеза P = NP. Это предположение, что сложные задачи вроде нахождения простых множителей для большого числа действительно сложные. Если когда-нибудь для них выведут простой и быстрый алгоритм решения, то всё шифрование придётся придумывать заново.
Что дальше
В следующий раз разберём, как работают другие мессенджеры и привычные нам технологии, которые мы используем каждый день. Подпишитесь, чтобы не пропустить.