2015-11-18 6 views
-1

Я решил начать с двойной аутентификации пароля в недавнем проекте. Детали входа: электронная почта, пароль, секрет.Проверка двойного пароля

Пароль (мин. 8 ч.) И секрет (мин. 6 ч) - это два пароля.

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

openssl_encrypt($email, 'aes-256-cbc', $password, false, $secret) 

Является ли это безопасным или я просто придумал плохую идею?

+1

посмотреть 'password_hash', его односторонний хэш, http://php.net/manual/en/function.password-hash.php – Andrew

+0

, который требует, чтобы я хранил пароль. Моя идея состояла в том, чтобы не хранить пароли, просто зашифрованное имя пользователя на основе их – transilvlad

+0

Что заставляет вас думать, что два пароля лучше одного? Это не двухфакторная аутентификация, которая обычно означает два из: то, что вы знаете (например: пароль), то, что у вас есть (например: RSA fob) или что-то, что вы (например: отпечаток пальца). – zaph

ответ

0

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

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

Что вы опубликовали - это версия вышеуказанного стандарта.

+2

* «После этого вы используете этот пароль с помощью этой соли» * - Если это ссылка на 'password_hash()', добавлено дополнительное соление из PHP 7.0 и рекомендуется не создавать свою соль. –

+0

Я имею в виду процесс генерации безопасного хэша в целом, а не специально для функции password_hash. Спасибо за точку хотя! – DaOgre

+0

Итак, я понимаю, мой метод так же безопасен? – transilvlad

3

Это безопасно или я просто придумал плохую идею?

Вы rolling your own crypto, так что в этом смысле является плохая идея.

Что касается безопасности: openssl_encrypt() ожидает, что параметр $password будет криптографическим ключом, а не удобочитаемым человеком. Аналогичным образом, IV должна быть случайной для каждого сообщения. Использование считываемых человеком значений для обоих входов опасно. (В частности, вы более восприимчивы к грубой силе.)

Это звучит, как вы хотите использовать password_hash() + password_verify(), а затем интегрировать с раствором аутентификации два фактора (например, Yubikey, Google Authenticator) для «секретного» поля.

Смежные вопросы