Доброго времени суток, друзья!

Хочу поделиться с вами результатами небольшого эксперимента.

Суть эксперимента заключается в использовании Web Cryptography API для шифрования отправляемых в чате сообщений.

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

По разным причинам, я выбрал второй вариант.

Код проекта находится здесь.

Демо можно посмотреть здесь (база данных по понятным причинам отключена).

Чат выглядит так:



Клиент реализован на ванильном JavaScript (для более широкого охвата аудитории), сервер реализован с помощью Express, в качестве базы данных используется облачная MongoDB, для взаимодействия с ней — Mongoose.

Для обмена сообщениями и на клиенте, и на сервере используется Socket.io.

При запуске приложения пользователю предлагается заполнить два поля: имя и секретный ключ. Секретный ключ генерируется (выводится в консоль) при нажатии соответствующей кнопки. Он имеет примерно такой вид: 0A9sJbvjSJOjH5PY. Опционально, данные пользователя можно сохранить в локальном хранилище.

Ключ используется для шифрования и дешифровки сообщений. Зашифрованные сообщения имеют примерно такой вид: GfTbL+JpFEUPnb96OEz7YqOV~C85B2xPf4kk3PYqhw/QFcu7e7l+8klk3XXhFiocdED0=. Пользователи должны использовать одинаковые ключи, в противном случае, выбрасывается DOMException.

Возможности чата:

  • Отправка/получение зашифрованных сообщений
  • Регистрация подключения/отключения пользователя
  • Отображение списка подключенных пользователей
  • Регистрация количества подключений
  • Возможность удаления сообщений отправившим их пользователем и т.д.

Проект находится на начальном этапе и представляет собой рабочий прототип, а не полноценное приложение.

Дополнительный функционал включает в себя сервис-воркера и настройки безопасности для сервера.

Буду рад любой форме обратной связи.

Благодарю за внимание и хорошего дня.