Шифрование и безопасность в менеджере паролей
Вопрос, касающийся сторон безопасности в разработке менеджера паролей.
1. Вводная.
Для общего развития я работаю над реализацией менеджера паролей, стек react + node.js + mongodb. Есть тачка (digitalocean), развёрнуты два приложения - клиент и бекенд, оба на своих поддоменах с прикрученным https (с помощью certbot с автопродлением). На входе в ip сервера поднят общий прокси на ноде с маршрутизацией по поддоменам (вдруг это важно).
Теперь вопрос к ops'ерам: может ли подобный способ развёртки как-либо сказаться на безопасности, масштабируемости и пропускной способности (менее десятка тысяч юзеров)?
2. Схема обмена ключами и их генерация.
- Клиент проходит аутентификацию, передает пароль по https в теле post-запроса.
- Бекенд, владея своим общим для всех юзеров ключом, генерирует общий ключ для клиента на основе своего ключа и пароля юзера в качестве второй части.
- Бекенд возвращает http-only secured куку заголовком Set-Cookie, внутри сгенерированный общий ключ для текущего юзера.
Итого: сервер не сможет расшифровать данные юзера без участия этого юзера. Но если его пароль утечёт, то данные будут расшифрованы третьим лицом. В таком случае можно использовать не пароль, а кодовую фразу (passcode), которая применятеся самим юзером для блокировки сессии без логаута, что-то вроде дополнительного пароля. Такая практика обычно используется другими менеджерами паролей.
- В каждом запросе клиент будет передавать куку с общим ключом бекенду.
- Бекенд в свою очередь будет в каждом запросе проверять ключ на наличие и валидность.
- Если что-то идёт не так, бекенд чистит куку заголовком Set-Cookie с просроченной датой жизни и возвращает 401 статус.
- Если клиент получает 401 ошибку, то отображает форму ввода кодовой фразы (passcode) для повторной генерации ключа бекендом. Разлогина при этом нет, сессия продолжается.
3. Теперь главные вопросы по шифрованию и безопасности.
1. Адекватен ли общий flow по шифрованию и обмену между веб-клиентом и бекендом?
2. Безопасно ли держать ключ в http-only куке?
Полагаю, что да, раз к ней не будет доступа в js.
3. Какой способ шифрования требуется в данной ситуации?
Вероятно, это должно быть симметричное шифрование типа AES, только ключ для шифровки/расшифровки должен быть сгенерирован из двух половинок - passcode юзера и общего ключа бекенда. И в целом, какие виды шифрования сейчас считаются наиболее безопасными и современными?
4. Реализуется ли это всё адекватно на js?
Судя по всему, мне нужно средство генерации ключа и средство для самого шифрования. Было бы здорово увидеть сразу ссылки на либы ну или просто названия алгоритмов/методов/видов.
5. Как хранить данные в бд?
Пароли юзеров, которые используются при аутентификации и авторизации, я шифрую с помощью bcrypt. Сервер не может их расшифровать, только сравнить. Все остальные данные, видимо, должны быть в виде хеша после шифровки, если я всё правильно понимаю.
Главный вопрос, конечно, пункт 3 - конкретные решения/алгоритмы/методы/виды шифрования в моём случае.

