Я не уверен, что название является точным, пожалуйста, не стесняйтесь переименовать вопрос, если это необходимо.
Я думаю о службе, которая хранит конфиденциальные данные на удаленном сервере. Для обеспечения максимальной конфиденциальности данные будут зашифрованы на клиенте (с использованием AES), а ключ шифрования не будет храниться в любом месте, поэтому в случае взлома сервера конфиденциальные данные будут по-прежнему относительно безопасными.
Теперь проблема в том, что мне нужен второй пароль для доступа к службе, но этот второй пароль должен храниться где-то на сервере.
Это будет то, что происходит, когда пользователь регистрируется:
- пользователь выбирает имя пользователя / пароль ( Пароль A ) и ключ шифрования ( Пароль B ).
- хеш (пароль A) хранится на сервере
- Пароль B нигде не хранится.
, то:
- пользователь вводит Пароль A => Пароль A передается на сервер
- сервер проверяет хеш (пароль A) на пользователя db, предоставляет доступ
- клиент загружает настройки и зашифрованные данные
- Пользователь вводит Пароль B -> зашифрованные данные дешифруются (локально).
Это выглядит хорошо для меня, но недостатком является то, что пользователю нужно два разных паролей. Это нецелесообразно, а также сопряжено с риском того, что пользователи выбирают одну и ту же строку для обоих, что сильно снижает эффективность модели.
Я бы хотел использовать два независимых пароля, но спрашивать у пользователя только один.
Первая попытка
Первая идея, которая у меня возникла, - спросить пользователя пароль, затем разделить его на две части и использовать первую часть в качестве учетных данных службы (пароль A), а вторая часть будет ключом шифрования (пароль B).
Недостатком этого является снижение надежности паролей: если предоставленная пользователем строка уже слабая / короткая, пароль A и пароль B будут еще слабее.
Вторая попытка
Другой вариант: использовать предоставленный пользователем пароль в качестве ключа шифрования (Пароль B) и использовать хеш (SHA-256) этого пароля в качестве служебных учетных данных.
Регистрация:
- пользователь выбирает один пароль PASS
- хеш (PASS) передается на сервер
- сервер хранит хеш (hash (PASS)) с именем пользователя в пользователе db
Тогда:
- пользователь вводит PASS
- служба отправляет на сервер пароль A = hash (PASS)
- сервер проверяет хеш (пароль A) на пользователя db, предоставляет доступ
- клиент загружает настройки и зашифрованные данные
- клиент расшифровывает зашифрованные данные с помощью пароля B = PASS.
Это означает, что
- хеш пароля шифрования передается по сети 2)
- хеш (хэш (ключ шифрования)) теперь хранится на сервере, то есть вместе с зашифрованными данными
Значительно ли это снижает безопасность системы? То есть Когда злоумышленник получает доступ к серверу, проще ли расшифровать конфиденциальные данные, зная хеш (хэш (ключ шифрования))?
Есть ли другой (лучший) способ получить два независимых пароля, начиная с одной строки?