Восстановление пароля и шифрование пароля - PullRequest
1 голос
/ 22 марта 2019

Привет (извините за многословный пост)

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

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

Моя идея состоит в том, чтобы добавить вопросы безопасности на страницу регистрации, которая будет использоваться для создания второго производного ключа, и использовать его для шифрования главного ключа пользователя. Ответы не будут храниться в базе данных, только ключ, полученный из них. Вопросы будут в большей степени основаны на мнении, чем личные или фактические. Это будет означать, что существует две зашифрованные версии «мастер-ключа».

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

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

Кто-нибудь видит какие-либо потенциальные проблемы с этим подходом или есть другие предложения?

Спасибо

1 Ответ

0 голосов
/ 22 марта 2019

Неясно, от кого вы пытаетесь защитить данные (ваша организация или потенциальные злоумышленники), но я бы предположил, что злоумышленники - ваша главная задача, поскольку ваша организация имеет доступ к коду приложения и, следовательно, может просматриватьпароли, которые вводит пользователь (если только шифрование / дешифрование не выполняется на стороне клиента).

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

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

Таким образом, вы также получите более надежные пароли, чем те, которыесредний пользователь будет использовать.

...