Шифрование и безопасность в менеджере паролей

Вопрос, касающийся сторон безопасности в разработке менеджера паролей.

1. Вводная.

Для общего развития я работаю над реализацией менеджера паролей, стек react + node.js + mongodb. Есть тачка (digitalocean), развёрнуты два приложения - клиент и бекенд, оба на своих поддоменах с прикрученным https (с помощью certbot с автопродлением). На входе в ip сервера поднят общий прокси на ноде с маршрутизацией по поддоменам (вдруг это важно).

Теперь вопрос к ops'ерам: может ли подобный способ развёртки как-либо сказаться на безопасности, масштабируемости и пропускной способности (менее десятка тысяч юзеров)?

2. Схема обмена ключами и их генерация.

Аутентификация

  1. Клиент проходит аутентификацию, передает пароль по https в теле post-запроса.
  2. Бекенд, владея своим общим для всех юзеров ключом, генерирует общий ключ для клиента на основе своего ключа и пароля юзера в качестве второй части.
  3. Бекенд возвращает http-only secured куку заголовком Set-Cookie, внутри сгенерированный общий ключ для текущего юзера.

Итого: сервер не сможет расшифровать данные юзера без участия этого юзера. Но если его пароль утечёт, то данные будут расшифрованы третьим лицом. В таком случае можно использовать не пароль, а кодовую фразу (passcode), которая применятеся самим юзером для блокировки сессии без логаута, что-то вроде дополнительного пароля. Такая практика обычно используется другими менеджерами паролей.

Запрос

  1. В каждом запросе клиент будет передавать куку с общим ключом бекенду.
  2. Бекенд в свою очередь будет в каждом запросе проверять ключ на наличие и валидность.
  3. Если что-то идёт не так, бекенд чистит куку заголовком Set-Cookie с просроченной датой жизни и возвращает 401 статус.
  4. Если клиент получает 401 ошибку, то отображает форму ввода кодовой фразы (passcode) для повторной генерации ключа бекендом. Разлогина при этом нет, сессия продолжается.

3. Теперь главные вопросы по шифрованию и безопасности.

1. Адекватен ли общий flow по шифрованию и обмену между веб-клиентом и бекендом?

2. Безопасно ли держать ключ в http-only куке?
Полагаю, что да, раз к ней не будет доступа в js.

3. Какой способ шифрования требуется в данной ситуации?
Вероятно, это должно быть симметричное шифрование типа AES, только ключ для шифровки/расшифровки должен быть сгенерирован из двух половинок - passcode юзера и общего ключа бекенда. И в целом, какие виды шифрования сейчас считаются наиболее безопасными и современными?

4. Реализуется ли это всё адекватно на js?
Судя по всему, мне нужно средство генерации ключа и средство для самого шифрования. Было бы здорово увидеть сразу ссылки на либы ну или просто названия алгоритмов/методов/видов.

5. Как хранить данные в бд?
Пароли юзеров, которые используются при аутентификации и авторизации, я шифрую с помощью bcrypt. Сервер не может их расшифровать, только сравнить. Все остальные данные, видимо, должны быть в виде хеша после шифровки, если я всё правильно понимаю.


Главный вопрос, конечно, пункт 3 - конкретные решения/алгоритмы/методы/виды шифрования в моём случае.


Ответы (0 шт):