Я относительно новичок в php и только начинаю понимать смысл соли, когда речь идет о хэшировании паролей (я думаю?). В любом случае, вот моя проблема …
Прямо сейчас у меня есть база данных mysql с именем пользователя, паролем, солевым полем. Длина поля пароля составляет 64 символа, поле соля – 3 символа. В реестре каждому имени пользователя назначается случайная соль. У меня нет никаких проблем с этим (я считаю). Во-первых, желаемый пароль пользователя хешируется с помощью:
$hashedinput = hash ('sha256', $input);
После этого пользовательский пароль будет хэшироваться с солью, включенной в pbkdf2, следующей процедурой и введенной в базу данных:
$password = pbkdf2('sha256', $hashedinput, $salt, 10000, 64);
Моя проблема заключается в входе в систему. При сравнении хешированного пароля в базе данных с паролем, который вводит пользователь, он всегда возвращается! =. Вот что я делаю, чтобы проверить логин:
$userData = mysql_fetch_array($search, MYSQL_ASSOC); $inputhash = hash('sha256', $input); // From Form $salt = $userData['salt']; // Salt from DB $password = pbkdf2('sha256', $inputhash, $salt, 10000, 64); $knownpassword = $userData['password']; // Known password from DB
Таким образом, для устранения неполадок я выбрал все выходы, и это то, на что похоже, когда я ввожу пароль CORRECT (и он не входит в систему):
Введите пароль: 3d8bc905668c1a1cca5b53a78941d3ca4673e12df6ac5e98e19fa47b153406f6e66913e43bf60478907ca07429b0cf90c808ce2097e0544cc44d298bfb7b85ad
DB пароль: 3d8bc905668c1a1cca5b53a78941d3ca4673e12df6ac5e98e19fa47b153406f6
Обратите внимание, что пароль ввода имеет первые 64 символа, но он продолжает работать на 128 символов. Пароль БД – всего 64.
Спасибо заранее!
Томас Птачек написал замечательную статью , пояснив – в какой-то степени – какая соль, почему она полезна и дала правилу № 1, которое вам нужно запомнить о системах хэширования паролей:
Используйте чужую систему паролей. Не создавайте свои собственные.
Если вы собираетесь использовать PHP 5.5 в своем приложении, используйте новый API password_hash ; если вы этого не сделаете, убедитесь, что используете хотя бы PHP 5.3 и используете библиотеку совместимости user_hash . Они предназначены для того, чтобы избавить вас от этой боли.