Автор проекта - Чудинов Никита, БПМИ145.
Данный проект представляет из себя комплекс нескольких систем, при помощи которого люди могут обмениваться сообщениями, с тем условием, что все сообщения шифруются end-to-end, и человек-в-середине не может прочитать передаваемую информацию.
Интерфейсом является обычная веб-страница, аналогичная по дизайну распространённым ныне аналогичным сервисам (например, Telegram). Важнейшим критерием при её создании была лёгкость и незагруженность.
Язык программирования Go, PostgreSQL, Websockets, nginx.
Основная часть сервиса представляет из себя один большой исполняемый файл, который достаточно запустить, чтобы сервис работал. Можно настроить порт, на котором он будет ожидать соединения, и, в целом, большой дополнительной доработки не требуется.
Для хранения данных о пользователях и зашифрованных сообщений используется СУБД PostgreSQL. В проекте есть файл, который состоит из набора команд, которые достаточно исполнить, чтобы создать "минимальную" рабочую базу - создать все таблицы и необходимые роли, дать необходимые права, создать индексы.
Для дополнительной безопасности (так сделано в поднятом примере на интерактивном примере), можно использовать протокол HTTPS, который без особых проблем можно обратно проксировать (с порта веб-сервера) на порт приложения при помощи распространённых инструментов. В моём случае используется nginx, при этом это не требует никаких специальных настроек сервиса, и минимальная настройка обратного проксирования с повышенной безопасностью теперь абсолютно бесплатна (благодаря Let's Encrypt!) и не занимает много времени.
Практически весь бэкэнд написан на языке Go. В нём очень богатая встроенная (и почти встроенная, дополнительная лежащая на сайте языка) библиотека стандартных модулей, благодаря чему разработка идёт приблизительно так же, как и на языке Python.
Обмен данными с сервисом производится по протоколу Websocket, работа с которым реализована в расширенной библиотеке Go. Это простой в использовании, широко распространённый протокол, крайне безопасный при использовании TLS.
Сервис состоит из нескольких модулей, основные из которых это site
и chat
. Они представляют, соответственно, бэкэнды веб-сайта и сервиса, который обрабатывает сообщения. Также есть вспомогательные модули, такие как auth
или database
, которые выделены для поддержания принципа DRY и выполняют цели, очевидные из их названий.
Пароли хранятся в виде специальных, предназначенных для этого хэшэй bcrypt, и пользовательские сессии проверяются при помощи токенов. Токены выдаются на долгое время (для логина) и на короткое (для установки соединения с чатом).
Фронтенд написан с использованием минимума библиотек. Используется JQuery, так как он широко распространён, и, при этом, загружается с Google CDN, так что почти у всех он доолжен быть закеширован. Также используется библиотека SJCL (Stanford Javascript Cryptography Library), потому что она очень лёгкая (6.5 кБ), и я подчинялся старому правилу "don't roll your own crypto".
Фронтэнд - это несколько простых HTML+CSS страниц, и они не представляют из себя особо сложного. Свёрстано при помощи флексбоксов.