Приветствую тебя, Хабрачитатель!
Последнее обновление мультипротокольного мобильного клиента IM+ принесло с собой поддержку протокола шифрования OTR (Off-the-Record). Примечательно что функция шифрования доступна независимо от того, каким IM-протоколом вы пользуетесь при общении (OSCAR, Jabber, Gtalk, MSN, YIM или другой).
Основные свойства этого протокола:
- шифрование сообщений — никто иной не сможет прочитать сообщения;
- аутентификация собеседников — уверенность в том, кто является собеседником;
- если потеряны секретные ключи, прошлая переписка не будет скомпрометирована;
Где это работает?
Шифрование OTR среди «десктопных» клиентов поддерживают:
- Adium (Mac OS X) имеет встроенную поддержку;
- Climm (Unix) имеет встроенную поддержку;
- Gajim (Microsoft Windows, Linux, FreeBSD) с плагином от третьих разработчиков;
- irssi (Unix) с плагином от третьих разработчиков;
- Kopete (Unix) с плагином от третьих разработчиков;
- Miranda IM (Microsoft Windows) с плагином от третьих разработчиков;
- Pidgin, ранее Gaim, (кросс-платформенное приложение) с официальным плагином;
- Psi+ (Microsoft Windows, Linux) с плагином от третьих разработчиков;
- qutIM (Microsoft Windows, Linux, Mac OS X) с плагином OTR (libofftherecord), который написан самим же автором qutIM и доступен «из коробки»;
- Trillian (Microsoft Windows) с плагином от третьих разработчиков;
- Vacuum-IM (Microsoft Windows, Linux, Mac OS X) с официальным плагином.
Кроме того, для протокола OSCAR существует решение в виде OTR через прокси (поддерживаются соединения SOCKS5, HTTPS и HTTP.)
Как это работает?
Обмен ключами
OTR использует протокол Диффи-Хельмана для обмена ключами. В общем виде, эта схема обмена ключами была изобретённая в 1976 году, и стала первым практическим методом для получения общего секретного ключа при общении через незащищенный канал связи.
При работе алгоритма, каждая сторона:
1. Генерирует случайное натуральное число a — закрытый ключ
2. Совместно с удалённой стороной устанавливает открытые параметры p и g (обычно значения p и g генерируются на одной стороне и передаются другой), где:
— p является случайным простым числом
— g является первообразным корнем по модулю p
3. Вычисляет открытый ключ A, используя преобразование над закрытым ключом
A = ga mod p
4. Обменивается открытыми ключами с удалённой стороной
5. Вычисляет общий секретный ключ K, используя открытый ключ удаленной стороны B и свой закрытый ключ a
K = Ba mod p
К получается равным с обеих сторон, потому что:
Ba mod p = (gb mod p)a mod p = gab mod p = (ga mod p)b mod p = Ab mod p
В практических реализациях, для a и b используются числа порядка 10100 и p порядка 10300.
Число g не обязано быть большим и обычно имеет значение в пределах первого десятка.
Аутентификация
Для цифровых подписей в OTR используется алгоритм RSA, ведь без дополнительных средств аутентификации пользователи не могли быть уверены, с кем именно они сгенерировали общий секретный ключ.
Таким образом, для отправителя алгоритм будет следующим:
- Взять открытый текст m
- Создать цифровую подпись s с помощью своего секретного ключа {d,n}:
s = Sa(m) = md mod n
- Передать пару {m,s}, состоящую из сообщения и подписи.
Для получателя алгоритм обратный:
- Принять пару {m,s}
- Принять открытый ключ {e,n} от отправителя
- Вычислить прообраз сообщения из подписи:
m' = Ps(s) = se mod e
- Проверить подлинность подписи (и неизменность сообщения), сравнив m и m'
Шифрование
Для шифрования в OTR применен блочный шифр AES. Этот алгоритм хорошо проанализирован и сейчас широко используется, являясь одним из самых распространённых алгоритмов симметричного шифрования. Созданный в 1998 году, и опубликованный в 2001, сейчас его можно встретить повсеместно. Например поддержка AES введена фирмой Intel в семейство процессоров x86 начиная с Intel Core i7-980X Extreme Edition, а теперь и на процессорах Sandy Bridge.
Учитывая его популярность, в сети регулярно появляются публикации посвященные способам нахождения ключа, но не смотря на это, 128-битное шифрование AES по прежнему является достаточно надежным.
Хеширование
В качестве алгоритма хеширования в OTR используется SHA1 (Secure Hash Algorithm 1), разработанный еще в 1995 году. Для входного сообщения произвольной длины алгоритм генерирует 160-битное хеш-значение, называемое также дайджестом сообщения.
Теоретически SHA-1 считается взломанным (количество вычислительных операций сокращено в 280-63 = 131 000 раз), на практике подобный взлом малоосуществим, как займёт много лет. Однако это время может быть кардинально сокращено при условии использования распределенных вычислений и вычислений с использованием GPU. Уже сейчас идут поиски альтернатив существующим SHA-1 и SHA-2 (будущий стандарт будет иметь «неожиданное» имя SHA-3).
SHA-1 в OTR используется для реализации функции HMAC (hash-based message authentication code, т.е. хеш-код идентификации сообщений). При использовании HMAC полученный код аутентичности позволяет убедиться в том, что данные не изменялись каким бы то ни было способом с тех пор как они были созданы, переданы или сохранены доверенным источником.
Для такого рода проверки необходимо, чтобы, например, две доверяющие друг другу стороны заранее договорились об использовании секретного ключа, который известен только им. Тем самым гарантируется аутентичность источника и сообщения. Недостаток такого подхода очевиден — необходимо наличие двух доверяющих друг другу сторон.
Протокол социалиста миллионера
Socialist Millionaire Protocol (SMP) используется в OTR для проверки подлинности противоположной стороны, зная какой-то общий секрет. Данный протокол позволяет удостоверится в том, что участники знают какую-то общую информацию (пароль, ответ на вопрос известный только им) не разглашая её напрямую, не обмениваясь какими-либо её отпечатками, которые могут быть использованы во вред человеком-посередине.
Man in the middle, MITM-атака — ситуация, когда посторонний (атакующий) способен читать и видоизменять по своей воле сообщения, которыми обмениваются корреспонденты, причём ни один из последних не может догадаться о его присутствии в канале.
OTR использует SMP для сравнения не «богатств» миллионеров, а для сравнения информации двух участников. Если точнее, то сравниваются два идентификатора сессии, отпечатки публичных ключей участников и собственно самого «секрета».
Как это выглядит?
При беседе через любой протокол, например Gtalk, для старта защищенного OTR сеанса связи достаточно нажать на иконку с открытым замком:
Если клиент собеседника не поддерживает OTR, собеседник получит следующее сообщение:
?OTR?v2?
%имя собеседника% has requested an Off-the-Record private conversation. However, you do not have a plugin to support that.
See otr.cypherpunks.ca for more information.
Загадочный заголовок сообщения ?OTR?v2? подсказывает о необходимой версии протокола OTR — v2.
В случае если собеседник использует IM+ (или другой клиент с поддержкой OTR), появится предложение начать зашифрованный сеанс связи.
После обмена «shared secret» — секретной информацией, которая известна лишь обоим собеседникам (очевидно что оговорить её следует по другому каналу связи — личная встреча, телефонный звонок, почтовые голуби), будет начата OTR-сессия связи. История сообщений во время сессии OTR не сохраняется.
Что ещё можно добавить? Функцию OTR в клиентах IM+ для Android и iOS можно активировать прямо из приложения, через систему In-App Purchase, «цена безопасности» — 5 долларов США, единоразово.
Других мобильных клиентов с поддержкой OTR я ещё не встречал, если они есть — делитесь информацией в комментариях. Спасибо за внимание :)
UPD1: В последней версии qutIM для Maemo также есть поддержка OTR. Для этого нужно поставить пакеты qutim и qutim-extra-plugins из Extras-devel репозитария.
UPD2: xabber для Android также поддерживает OTR-шифрование.
UPD3: Дополнительную информацию можно найти в Wikipedia и на официальной странице OTR.