Шифрование сообщений в SecureDialogues +2


Шифрование, цифровая подпись, защита данных — термины довольно распространенные среди IT-специалистов.


Уже написано очень много интересных публикаций, статей и книг на эти темы. После прочтения одной из них, я решил попробовать свои силы на практике. Так и родился проект, о котором речь пойдет ниже.


Краткое описание приложения


Приложение SecureDialogues добавляет уровень шифрования сообщений, которые передаются через такие сервисы, как Gmail. Приложение само выполняет авторизацию для настроенных сервисов по протоколу OAuth2, принимает и отправляет сообщения. По своей сути — это обычный мессенджер, который обеспечивает криптографическую защиту сообщениям, разве что для передачи может использоваться один из нескольких сторонних сервисов.


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


Исходные коды доступны по ссылке, wiki проекта.


Доступен запуск приложения в контейнере docker, подробнее по ссылке.


Цель создания


Приложение создавалось с вполне конкретной целью — мне было интересно поработать с криптографией на практическом проекте. Причем не в каком-то простом, вроде "сюда вставьте текст, а вот здесь возьмите закодированное сообщение", а в таком, чтобы была и цифровая подпись, и ассиметричное шифрование, и сеансовые ключи и прочие интересные вещи. Поэтому был выбран проект мессенджера.


В отсутствии всей необходимой инфраструктуры для передачи сообщений, эта функция делегируется уже существующим сервисам вроде Gmail или ВКонтакте.


Описание интерфейса


При первом запуске приложение попросит Вас ввести пароль:



Данный пароль используется для шифрования данных, которые хранятся на жестком диске, таких как: ключи RSA, токены авторизации для OAuth2, данные о сервисах и контактах.


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


При последующих запусках приложение так же запрашивает пароль, чтобы расшифровать и загрузить сохраненные ранее данные.


Вид главного окна приложения:



Перед тем, как Вы сможете отправить первое сообщение, необходимо выполнить два шага:



Самое главное, из-за чего контакт добавляется до начала обмена — это публичный ключ. Каждое сообщение, которое пересылается между пользователями обязательно подписывается отправителем. Если получатель не смог проверить цифровую подпись с помощью публичного ключа, то такое сообщение отбрасывается.


Также публичный ключ используется для шифрования сессионного ключа.


После того, как все предварительные этапы пройдены, можно начать диалог. Для этого в главном окне приложения есть соответствующая кнопка (подробнее на wiki). Во время создания диалога генерируется сессионный ключ, которым будет шифроваться все сообщения в рамках этого диалога.


Все диалоги отображаются в главном окне слева. После того, как Ваш собеседник подтвердил создание диалога, можно будет отправлять и принимать в нем сообщения:



Чтобы отправить или прочитать сообщения в нужном диалоге, его нужно выбрать щелчком левой кнопки мыши.


Сообщения удаленного пользователя отображаются слева, а Ваши — справа. Если сообщение еще не доставлено, то оно отображается серым:



Приложение сортирует список диалогов в следующем порядке — в самом верху будут активные диалоги, для которых разрешена отправка сообщений, а в самом низу — закрытые. Так же на порядок влияет время изменения диалога. Активный диалог, который последним получил сообщение будет выше всех, а первый закрытый — внизу. Для каждого диалога показывается индикатор количества непрочитанных сообщений, при их наличии:



Статус диалога выделяется цветом:


  • красным отмечаются закрытые диалоги
  • зеленым показаны активные диалоги, для них возможно отправлять сообщения
  • серые диалоги находятся в процессе создания.

Вот пример того, как выглядит простое сообщение с текстом hellow world!:



Сигнальный обмен


Обмен сообщениями между собеседниками A и B состоит из следующих этапов:


  • сторона A генерирует команду на создание диалога (CREATE_DIALOG) и подписывает ее своим закрытым ключом;
  • сторона B запрашивает у пользователя согласие на создание диалога, и, если пользователь согласен, то генерируется сеансовый ключ T и случайная строка R, которые по отдельности шифруются публичным ключом A и помещаются в тело сообщения (VERIFY_KEY). Все сообщение подписывается приватным ключом B.
  • сторона A дешифрует сеансовый ключ и случайную строку, шифрует случайную строку сеансовым ключом, добавляет результат в тело сообщения KEY_VERIFICATION. Подписывает все сообщение своим закрытым ключом.
  • сторона B дешифрует случайную строку, проверят на соответствие результата строке R, если все верно, то отсылается подписанное сообщение ACCEPT_DIALOG, которое означает, что диалог установлен и далее возможен обмен сообщений.

Успешное установление диалога и сигнальный обмен показаны на рисунке:



Дальнейшее развитие проекта


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


В дальнейшем планируется его увеличить. Уже ведется работа по включению в него ВКонтакте.


Так же в проекте увеличение информативности пользовательского интерфейса, вроде добавления статуса подключения к сервису (активно, ошибка подключения и пр).


Алгоритм проверки дублирующихся сообщений работает не самым лучшим образом, планируется его доработка.




К сожалению, не доступен сервер mySQL