Все мессенджеры гарантируют пользователям тайну переписки. Но запросов уполномоченных органов это не касается — при необходимости органы получат любые сведения о пользователе, в том числе сообщения, список контактов и номер телефона. Если таковые сведения доступны уполномоченным органам, они могут стать доступны и злоумышленникам. И как всегда, в зоне риска бизнес.
В этом кейсе мы расскажем, как создали мессенджер первый в мире для переписки, который позволяет общаться без сканирования телефонной книги и списка номеров, — Incognito Private Messenger.
Предыстория
Заказчик — частное лицо, предприниматель. По роду своей деятельности он общается с бизнесменами, политиками, банкирами. Для общения, обсуждения сделок и передачи информации ему приходится использовать мессенджеры.
Все существующие мессенджеры привязаны к телефонной книге, номеру телефона и личным данным. В случае взлома, помимо этих сведений, злоумышленники могут получить информацию о сделках, банковские и личные данные. Для людей, которым приходится обмениваться конфиденциальной информацией, необходим защищенный мессенджер.
Задача
Создать мессенджер без идентификации пользователя для iOS и Android.
Пожелания:
- Дизайн приложения должен ассоциироваться с приватностью — все должно выглядеть зашифрованным.
- Вход в чат несколькими способами, все они должны быть простыми и понятными.
- Возможность максимально быстро удалить переписку.
- Возможность поставить пароль на приложение, чтобы никто из домочадцев не смог войти.
Функциональные особенности
- Без регистрации. Чтобы начать использовать мессенджер, не нужно указывать никаких данных, даже имя. Приложение не имеет доступа к контактам и другим личным данным.
- Если собеседник сделал скриншот — второй участник беседы получает уведомление об этом.
- В чате нет имен.
- Подключиться к чату можно несколькими способами.
- После удаления чата не остается следов. Никаких архивов и историй переписки.
- Можно установить пароль для входа в приложение.
- Вся переписка надежно защищена ключом сквозного шифрования. Сообщения шифруются по сложнейшему алгоритму, где ключ шифрования придумывает пользователь.
Решение
Для создания приложения с такими функциональными особенностями следовало решить несколько задач:
- Разработать соответствующий дизайн, который бы подчеркнул приватность мессенджера и отвечал пожеланиям заказчика.
- Выбрать тип шифрования и обеспечить 100% приватность.
- Все задумки перенести в программный код. При этом обеспечить надежность и высокую скорость работы приложения, а также его способность выдерживать высокие нагрузки.
Чтобы решить эти задачи, мы использовали современный стек технологий.
Дизайн
На первом этапе мы разработали две концепции дизайна: светлый и темный. Решили остановиться на темном, так как именно такой дизайн у пользователя ассоциируется с приватностью. Для иконки тоже взяли привычный пользователям образ — некто в шляпе. Образ человека в шляпе раскрыли с помощью ярких оттенков.
Кликабельные элементы не должны сливаться с основным темным цветом приложения, поэтому для них выбрали яркие, в меру контрастные цвета.
Подчеркиваем приватность
Одна из задач — обозначить участников чата без привязки к личным данным, по которым их можно было бы идентифицировать. Задачу решили с помощью кодового слова. О нем участники чата договариваются заранее вне приложения или используют фразу, которая сразу ассоциируется с участником будущего диалога.
Помимо кодового слова в чате, пользователь может настроить свой дополнительный уникальный ключ шифрования. После того, как ключ создан, пользователь видит анимацию. Так закрепляется визуальный эффект.
Разработали оповещение на iOS о том, что второй участник чата сделал скриншот переписки. В версии для Андроид пользователь может полностью отключить возможность делать скриншоты в приложении.
При необходимости вся переписка удаляется одним нажатием кнопки. На вход в приложение можно установить пароль.
Как все работает изнутри
Приватность
Фишка проекта в том, что пользователь обезличен, нет ни одного идентификатора, который бы указывал на личность человека. Чтобы создать чат, пользователи в офлайн должны договориться о кодовом слове.
Механизм такой: пользователь А создает чат, дает ему название и приглашает в чат пользователей В и С. Пользователи В и С могут войти в чат тремя способами:
перейти по ссылке,
вручную ввести кодовое слово,
использовать QR-код.
Количество пользователей в одном чате не ограничено.
Шифрование
Для шифрования и дешифрования сообщений необходим криптографический ключ. Допустим, мы обмениваемся секретными сообщениями через курьера. Если сообщение не зашифровано, курьер его может прочитать. Переписку нужно зашифровать, а перед этим передать секретный ключ второму абоненту. Просто передать его нельзя, так как курьер может расшифровать сообщение. Чтобы решить задачу с обменом секретными ключами, мы использовали алгоритм Диффи-Хеллмана.
В этом алгоритме передача данных основана на принципе end-2-end шифрования. Это самый безопасный протокол, в котором шифровка и расшифровка сообщений происходят без участия сервера. Сервер служит лишь инструментом передачи уже зашифрованных сообщений. Среднее время обработки одного сообщения измеряется в миллисекундах и стремится к нулю. Сервер хранит только лишь зашифрованные сообщения, которые не доставлены адресату (например, при отсутствии подключения к интернету) и автоматически удаляет их через 7 дней, если получатель так и не появился в сети. Расшифровать информацию может только получатель с помощью закрытого ключа. Таким образом, на серверах не остается никаких следов.
Архитектура, стек технологий
Для разработки back-end мы выбрали платформу NodeJS. По нашему мнению, эта платформа лучше всего подходит для реализации чатов с использованием сокетов. Платформа легко и быстро масштабируется. С коробки есть поддержка 10 тысяч подключений на одной ноде. Количество подключений можно увеличить до 100 тысяч. Для этого достаточно изменить настройки.
Для быстрой работы с данными чатов и удобного трансфера данных нам нужна NoSQL БД (хранение зашифрованных данных до момента доставки получателю) . Большинство компаний для этой цели используют MongoDB. Но для нашей цели это решение не подходило — в MongoDB есть ряд проблем с очисткой файлов после удаления записей, а также с масштабированием.
Поэтому в качестве базы данных мы выбрали RethinkDB. У этой базы данных нет таких проблем и есть удобный синтаксис для работы с выборкой RQL (Resource Query Language).
Android
Приложение для Android написано на Kotlin и соответствует последним рекомендациям Google. Мессенджер мы создали на основе шаблона проектирования архитектуры MvVM с использованием Android Architecture Components. Этот шаблон позволяет создать гибкую архитектуру. Поэтому в будущем мы без проблем сможем расширить функционал приложения.
iOS
Для создания приложения для iOS мы использовали наш Scaffold на базе MvVM шаблона проектирования. В будущем можно будет расширить функционал приложения.
Приложение Incognito Private Messenger обеспечивает 100% конфиденциальность
Это главное преимущество проекта в сравнении с аналогами. Переписка пользователей хранится только на клиентах. На сервере хранится только привязка устройств к чату и уведомления. Там нет ключей или какой-то другой информации, которая бы позволила скомпрометировать алгоритм шифрования.
Уникальное решение
Стандартная верификация пользователей в мессенджере невозможна, так как нет номеров телефонов. Поэтому мы разработали алгоритм проверки каждого клиента, который подключается к чату:
В момент добавления пользователи перекидываются парами ключей и при дешифрации проверяют подлинность друг друга.
Если все хорошо, администратор чата одобряет добавление.
Первоначальные ключи хранятся в защищенной области памяти устройства. А для шифрования кодов используется протокол Диффи - Хеллмана, поэтому подделать их невозможно.
Заключение
Incognito Private Messenger — уникальный в своем роде. Дальше, по мере необходимости и по мере роста числа пользователей, мы будем расширять функционал приложения. Все возможности для этого мы предусмотрели.
Кроме того, сейчас мы работаем над локализацией мессенджера и уже скоро он будет доступен к скачиванию на английском языке.