Шифрование, цифровая подпись, защита данных — термины довольно распространенные среди IT-специалистов.
Уже написано очень много интересных публикаций, статей и книг на эти темы. После прочтения одной из них, я решил попробовать свои силы на практике. Так и родился проект, о котором речь пойдет ниже.
Приложение SecureDialogues добавляет уровень шифрования сообщений, которые передаются через такие сервисы, как Gmail. Приложение само выполняет авторизацию для настроенных сервисов по протоколу OAuth2, принимает и отправляет сообщения. По своей сути — это обычный мессенджер, который обеспечивает криптографическую защиту сообщениям, разве что для передачи может использоваться один из нескольких сторонних сервисов.
Данные на жестком диске шифруются по алгоритму AES 256-битным ключом, который извлекается из пароля, введенного при запуске, для цифровой подписи используется RSA. Сообщения пользователей кодируются сеансовым 256-битным ключом AES.
Исходные коды доступны по ссылке, wiki проекта.
Доступен запуск приложения в контейнере docker, подробнее по ссылке.
Приложение создавалось с вполне конкретной целью — мне было интересно поработать с криптографией на практическом проекте. Причем не в каком-то простом, вроде "сюда вставьте текст, а вот здесь возьмите закодированное сообщение", а в таком, чтобы была и цифровая подпись, и ассиметричное шифрование, и сеансовые ключи и прочие интересные вещи. Поэтому был выбран проект мессенджера.
В отсутствии всей необходимой инфраструктуры для передачи сообщений, эта функция делегируется уже существующим сервисам вроде Gmail или ВКонтакте.
При первом запуске приложение попросит Вас ввести пароль:
Данный пароль используется для шифрования данных, которые хранятся на жестком диске, таких как: ключи RSA, токены авторизации для OAuth2, данные о сервисах и контактах.
Сообщения и информация о диалогах не сохраняется, то есть при завершении приложения данные о полученных сообщениях и открытых диалогах теряются.
При последующих запусках приложение так же запрашивает пароль, чтобы расшифровать и загрузить сохраненные ранее данные.
Вид главного окна приложения:
Перед тем, как Вы сможете отправить первое сообщение, необходимо выполнить два шага:
Самое главное, из-за чего контакт добавляется до начала обмена — это публичный ключ. Каждое сообщение, которое пересылается между пользователями обязательно подписывается отправителем. Если получатель не смог проверить цифровую подпись с помощью публичного ключа, то такое сообщение отбрасывается.
Также публичный ключ используется для шифрования сессионного ключа.
После того, как все предварительные этапы пройдены, можно начать диалог. Для этого в главном окне приложения есть соответствующая кнопка (подробнее на wiki). Во время создания диалога генерируется сессионный ключ, которым будет шифроваться все сообщения в рамках этого диалога.
Все диалоги отображаются в главном окне слева. После того, как Ваш собеседник подтвердил создание диалога, можно будет отправлять и принимать в нем сообщения:
Чтобы отправить или прочитать сообщения в нужном диалоге, его нужно выбрать щелчком левой кнопки мыши.
Сообщения удаленного пользователя отображаются слева, а Ваши — справа. Если сообщение еще не доставлено, то оно отображается серым:
Приложение сортирует список диалогов в следующем порядке — в самом верху будут активные диалоги, для которых разрешена отправка сообщений, а в самом низу — закрытые. Так же на порядок влияет время изменения диалога. Активный диалог, который последним получил сообщение будет выше всех, а первый закрытый — внизу. Для каждого диалога показывается индикатор количества непрочитанных сообщений, при их наличии:
Статус диалога выделяется цветом:
Вот пример того, как выглядит простое сообщение с текстом hellow world!:
Обмен сообщениями между собеседниками A и B состоит из следующих этапов:
CREATE_DIALOG
) и подписывает ее своим закрытым ключом;VERIFY_KEY
). Все сообщение подписывается приватным ключом B.KEY_VERIFICATION
. Подписывает все сообщение своим закрытым ключом.ACCEPT_DIALOG
, которое означает, что диалог установлен и далее возможен обмен сообщений.Успешное установление диалога и сигнальный обмен показаны на рисунке:
На данный момент приложение уже предоставляет базовые возможности по шифрованию сообщений и проверке подлинности посредством цифровой подписи. Но список поддерживаемых сервисов крайне маленьким.
В дальнейшем планируется его увеличить. Уже ведется работа по включению в него ВКонтакте.
Так же в проекте увеличение информативности пользовательского интерфейса, вроде добавления статуса подключения к сервису (активно, ошибка подключения и пр).
Алгоритм проверки дублирующихся сообщений работает не самым лучшим образом, планируется его доработка.
К сожалению, не доступен сервер mySQL