Большинству из нас известно, что «защищённые» приложения для обмена сообщениями, которые мы используем каждый день (SMS, WhatsApp, Viber, Skype и тд) на самом деле изобилуют возможностями перехвата переписки. Они используют промежуточные сервера для передачи сообщений и сохраняют копию каждого сообщения. Автоматически копия каждого сообщения дублируется на государственных серверах и оттуда уже никогда не удаляется. Также автоматически логируется информация о том, какой IP в какое время с кем общался.
Пару месяцев я задумался о том, как реализовать по-настоящему безопасное приложение для обмена сообщениями, которые невозможно перехватить никаким способом.
Иногда сообщения пытаются шифровать и отправить их на сервер уже шифрованными, но работает ли это в действительности? Здесь легко реализуется атака Man In The Middle, когда сервер притворяется клиентом, которому предназначается сообщение и получает сообщение в незашифрованном виде, хотя клиент думает, что сообщение может быть прочитано только конечным получателем.
Рассуждая над архитектурой приложения, которым можно было бы пользоваться каждый день и при этом не задумываться о проблемах приватности, я пришел к следующему набору:
- Открытый исходный код. Таким образом любой может детально изучить, как именно работает приложение и убедиться в отсутствии бэкдоров.
- P2P. Клиенты устанавливают соединение друг с другом напрямую. Сообщения никогда не проходят через сервер, что исключает возможность их перехвата в любом виде. В данный момент я рассматриваю WebRTC Jingle, чтобы реализовать P2P с использованием libjingle для iOS и Android.
- TOR. Все соединения клиент осуществляет внутри анонимной сети Tor. Таким образом скрываются IP адреса клиентов, а также происходит первоначальная шифрация трафика, которая предоставращает прослушивание.
- OTR используется для дополнительного шифрования всех сообщений между пользователями и целей аутентификации.
- Версия для Android разрабатывается на базе ChatSecure. Версия для iOS разрабатывается с нуля.
- Для того, чтобы помочь клиентам найти друг друга и установить прямые P2P соединения, используется XMPP сервер. В данный момент выбор лежит между Openfire и ejabberd.
Что я упустил при разработке безопасной архитектуры приложения? Что может быть улучшено?
Автор: golubevpavel