В этой статье я подробно опишу как использовать шифрование при передаче сообщений по сетям на основе XMPP с помощью пакета GnuPG. Показана процедура генерации ключевых пар под Windows, установка ключей в клиент Psi, проверка подписанного присутсвия, передача шифрованного сообщения.
Для чего может понадобится шифрование сообщений?
Сообщения шифруются с помощью криптосистемы с открытым ключом. Если не вдаваться в подробности, суть системы шифрования состоит в том, что существует пара ключей и некая процедура, которая может с помощью одного ключа преобразовать сообщение так, что обратное преобразование можно будет выполнить только с помощью другого ключа. Один из этих ключей называется закрытым и держится в тайне, другой же, напротив, называется открытым, и распространяется свободно. Таким образом, зашифровав сообщение открытым ключом можно быть уверенным, что его прочитает только владелец закрытого ключа, напротив, подписав что-то своим ключом автор даёт уверенность получателю сообщения в своём авторстве.
Можно объединить эти две процедуры и тогда содержимое будет известно только двум лицам, обладающими соответсвующими ключами. Наглядно это изображено на картинке:
На данный момент невозможно за обозримое время из открытого ключа восстановить закрытый.
В качестве системы шифрования мы будем использовать пакет с открытым кодом GnuPG (эй, не убегайте, это под Windiows тоже есть и очень даже юзерфрендли :)) и клиент Psi. Уверен, что в других клиентах процедура схожая. Я взял реализацию под windows, так как всё-таки её использует большинство пользователей, а юниксоиды, думаю, и сами разбирутся. В *nix в качестве удобного средства управления ключами можно посоветовать kgpg.
Предполагаю что у вас уже стоит jabber клиент, он настроен и соединение с сетью есть.
Для пользователей Windows специально создан пакет программ gpg4win, который существенно облегчает работу с GPG. Скачиваем gpg4win lite с официального сайта, выбираем необходимые компоненты и устанавливаем.
После установки, запускаем менеджер ключей WinPT. При первом запуске утилита предложит создать ключевую пару. Это очень важный шаг. Ключ это ваш паспорт в сети интернет, проверье внимательно имя и адрес, очень желательно его не терять и не забывать от него пароль. Восстановить закрытый ключ будет уже не возможно, придётся генерить новый. Каждый закрытый ключ шифруется паролем. Это нужно для того что бы даже если кто-то завладеет вашим ключом, злоумышленник не смог бы им воспользоваться, без пароля он бесполезен. Программа предожить забекапить ключ и это правильно.
Итак, вы сгенерили ключевую пару. Теперь в меню WinPT нужно выбрать Key -> Export… Таким образом вы получите файл *.asc, который будет содержать что-то вроде:
Это и есть ваш открытый ключ, его можно разослать друзьям и коллегам, с которыми вы собираетесь обмениваться сообщениеми. Естественно обмениваться ключами желательно через зашифрованный канал или банально переписать на CD-R/флешку. Так же можно разместить свой открытый ключ на своём вебсайте или в профайле хабра. Не буду вдаваться в подробности, но обмен ключами довольно забавная процедура, см. Web Of Trust и Key signing party
Итак, теперь надо сказать Psi, что нужно использовать ключ. Запускаем Psi, идём в настройки аккаунта, там во вкладке подробности нажимаем «выбрать openPGP ключ» и указываем наш ключ.
После выбора ключа и переподключения к сети, Psi затребует пароль от закрытого ключа:
Теперь вы подключены к сети и ваш статус подписан. То есть те, кто имеют ваш открытый ключ, знают, что за компьютером именно вы.
Допустим, вы обменялись с кем-то ключами, по есть отдали свой открытый ключ и получили чей-то открытый. Теперь нужно привязать ключ к конкретному аккаунту. Для этого заходим в WinPT, заходим в key->import, далее выбираем файл с ключом нужного человека. Всё, открытый ключ импортирован в систему. Стоит сказать, что Psi считывает состояние ключей только при запуске, так что после того как мы добавили новый ключ надо перезапустить Psi. Кликаем правой кнопкой мыши на нужный контакт и выбираем «Присвоить ключ OpenPGP», присваиваем контакту его ключ. Теперь мы можем проверить электронную подпись нашего контакта:
Выделенная зелёным строчка означает, что контакт вошёл в сеть с правильным ключом и у вас есть его открытый ключ. Если строчка чёрная это означает, что статус клиента подписан, но у вас нет его ключа или ключ неверен, так что неизвестно кто там за компом.
Теперь всё что требуется это отрыть новое окно с чатом и нажать иконку с замочком. Произойдёт сверка ключей и, если всё в порядке, система выдаст сообщение о том, что разговор зашифрован. После этого можно общатся спокойно, не беспокоясь что разговор будет перехвачен в пути.
Последнее сообщение в шифрованном виде выглядит так:
Можно быть уверенным, что в ближайшие 50 лет никто не сможет это прочитать.
Итак, как видно, шифровать сообщения на лету очень просто, для конечного юзера не меняется практически ничего, а надёжность системы возрастает. Может быть это и сподвигнет кого-то перейти на xmpp/jabber.
Но всегда нужно помнить:
Спасибо за внимание, надеюсь было интересно. :)
Мотивация
Для чего может понадобится шифрование сообщений?
- Так как сеть XMPP федеративная и каждый может основать свой узел, то ставится вопрос доверия администратору данного сервера. Сервер могут сломать, сам админ может подбарижить данными и т.д.
- XMPP набирает популярность в качестве внутрикорпоративного обмена. Может быть сервер и не имеет выхода в Интернет, но никто не застрахован от приезда Party-van с маски-шоу внутри
- Цифровая подпись повышает надёжность идентификации. То есть вы точно знаете что в данный момент за компьютером сидит именно тот человек, который вам дал ключ, а не тот кто ломанул его аккаунт или воспользовался его отсутсвием его за компьютером
Немного теории
Сообщения шифруются с помощью криптосистемы с открытым ключом. Если не вдаваться в подробности, суть системы шифрования состоит в том, что существует пара ключей и некая процедура, которая может с помощью одного ключа преобразовать сообщение так, что обратное преобразование можно будет выполнить только с помощью другого ключа. Один из этих ключей называется закрытым и держится в тайне, другой же, напротив, называется открытым, и распространяется свободно. Таким образом, зашифровав сообщение открытым ключом можно быть уверенным, что его прочитает только владелец закрытого ключа, напротив, подписав что-то своим ключом автор даёт уверенность получателю сообщения в своём авторстве.
Можно объединить эти две процедуры и тогда содержимое будет известно только двум лицам, обладающими соответсвующими ключами. Наглядно это изображено на картинке:
На данный момент невозможно за обозримое время из открытого ключа восстановить закрытый.
Инструменты
В качестве системы шифрования мы будем использовать пакет с открытым кодом GnuPG (эй, не убегайте, это под Windiows тоже есть и очень даже юзерфрендли :)) и клиент Psi. Уверен, что в других клиентах процедура схожая. Я взял реализацию под windows, так как всё-таки её использует большинство пользователей, а юниксоиды, думаю, и сами разбирутся. В *nix в качестве удобного средства управления ключами можно посоветовать kgpg.
Предполагаю что у вас уже стоит jabber клиент, он настроен и соединение с сетью есть.
Шаг первый, загрузка ПО и генерация закрытого и открытого ключей
Для пользователей Windows специально создан пакет программ gpg4win, который существенно облегчает работу с GPG. Скачиваем gpg4win lite с официального сайта, выбираем необходимые компоненты и устанавливаем.
После установки, запускаем менеджер ключей WinPT. При первом запуске утилита предложит создать ключевую пару. Это очень важный шаг. Ключ это ваш паспорт в сети интернет, проверье внимательно имя и адрес, очень желательно его не терять и не забывать от него пароль. Восстановить закрытый ключ будет уже не возможно, придётся генерить новый. Каждый закрытый ключ шифруется паролем. Это нужно для того что бы даже если кто-то завладеет вашим ключом, злоумышленник не смог бы им воспользоваться, без пароля он бесполезен. Программа предожить забекапить ключ и это правильно.
Итак, вы сгенерили ключевую пару. Теперь в меню WinPT нужно выбрать Key -> Export… Таким образом вы получите файл *.asc, который будет содержать что-то вроде:
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.7 (MingW32)
mQGiBEmINMURBACJDeTglDCoq5HQ4bU6yFzqCTfYbCEjkNlMmvJK+5zesKVJhohK
LZ6oiCZaGt5B8rfY1qvJvgIQNvWOsp63lviPSTamndlmlDeTOXbqc21iEE6E9mOS
.....
Это и есть ваш открытый ключ, его можно разослать друзьям и коллегам, с которыми вы собираетесь обмениваться сообщениеми. Естественно обмениваться ключами желательно через зашифрованный канал или банально переписать на CD-R/флешку. Так же можно разместить свой открытый ключ на своём вебсайте или в профайле хабра. Не буду вдаваться в подробности, но обмен ключами довольно забавная процедура, см. Web Of Trust и Key signing party
Шаг второй, добавление своего ключа в Psi и импорт открытых ключей контактов
Итак, теперь надо сказать Psi, что нужно использовать ключ. Запускаем Psi, идём в настройки аккаунта, там во вкладке подробности нажимаем «выбрать openPGP ключ» и указываем наш ключ.
После выбора ключа и переподключения к сети, Psi затребует пароль от закрытого ключа:
Теперь вы подключены к сети и ваш статус подписан. То есть те, кто имеют ваш открытый ключ, знают, что за компьютером именно вы.
Допустим, вы обменялись с кем-то ключами, по есть отдали свой открытый ключ и получили чей-то открытый. Теперь нужно привязать ключ к конкретному аккаунту. Для этого заходим в WinPT, заходим в key->import, далее выбираем файл с ключом нужного человека. Всё, открытый ключ импортирован в систему. Стоит сказать, что Psi считывает состояние ключей только при запуске, так что после того как мы добавили новый ключ надо перезапустить Psi. Кликаем правой кнопкой мыши на нужный контакт и выбираем «Присвоить ключ OpenPGP», присваиваем контакту его ключ. Теперь мы можем проверить электронную подпись нашего контакта:
Выделенная зелёным строчка означает, что контакт вошёл в сеть с правильным ключом и у вас есть его открытый ключ. Если строчка чёрная это означает, что статус клиента подписан, но у вас нет его ключа или ключ неверен, так что неизвестно кто там за компом.
Шаг третьий. Обмениваемся шифрованными сообщениями
Теперь всё что требуется это отрыть новое окно с чатом и нажать иконку с замочком. Произойдёт сверка ключей и, если всё в порядке, система выдаст сообщение о том, что разговор зашифрован. После этого можно общатся спокойно, не беспокоясь что разговор будет перехвачен в пути.
Последнее сообщение в шифрованном виде выглядит так:
<message from="ivlis_test@jabber.ru/Psi" type="chat" xml:lang="ru-RU" to="ivan@ivlis.com/WorkF53B8E96" id="aaf8a" >
<body>[Ошибка: сообщение зашифровано, и невозможно его расшифровать.]</body>
<active xmlns="http://jabber.org/protocol/chatstates"/>
<x xmlns="jabber:x:encrypted">
hQEOA/CjxWiKTl51EAP9HaQ8nzTtjUECqiO+1lcJRciUJrOLkgFr/KTqjvOmEgvx
rtF4TCCjpBMElbVbjY+yYmV6F8IWMweRlU4olzDFfdbJYO/TGWq+22s3jIvhWI+e
7bfMn7qVcnDD7GsGxU8norUqjKHQmYvwdAwHBDdbf/AD0qqAvb7jK+1X1NXyeioD
/3lxyWobgoiCt165OwZu/G2osiDQlMTtzt/W198tzfpKoJURaUNkwhFJeOp3rgr0
77frKDbIO6IRloyHx1xL3kRZNEBOVJO5AYdflH0Z756wPt+mGpZ29vzbdt40hkwu
rHjnYEDJhj1oJkoRpesIgiPQxmXpbsRGrAcKQr2f4e3d0lgBCkkivC27qPEM0eFO
TQnVww+RGczA+VHRbpXCRvLx4fcle9qSEM0xgdkae7IWJXBQRVEootOqdNJz49G8
FPakyAsBoZ2XvrEqW+r6hXvLYrKGBYO2cI3F
=ysML</x>
</message>
* This source code was highlighted with Source Code Highlighter.
Можно быть уверенным, что в ближайшие 50 лет никто не сможет это прочитать.
Заключение
Итак, как видно, шифровать сообщения на лету очень просто, для конечного юзера не меняется практически ничего, а надёжность системы возрастает. Может быть это и сподвигнет кого-то перейти на xmpp/jabber.
Но всегда нужно помнить:
- Шифрование не отменяет голову. Храните пароль от ключей в секрете, сделите за кейлоггерами, вирусами и прочим.
- Это
Спасибо за внимание, надеюсь было интересно. :)