У меня есть следующий вопрос / требование.
Мой сайт имеет 2000 пользователей, однако пароли хранятся в виде обычного текста (я знаю, что это очень плохо). Прочитав различные блоги на сайте, я обнаружил, что мне нужно использовать современное хеширование паролей и засолку. я нашел php-login.net . Они используют современное соление / перемешивание.
Я скачал минимальный сценарий входа в систему, который я буду внедрять на моем сайте. Я настроил xampp для локального тестирования. Когда я регистрируюсь, пользователь хеширует пароли, и я могу войти.
Мое главное требование — я хочу хэшировать все мои текущие пароли в виде простого текста. Вход в php с использованием библиотеки совместимости паролей php.
password_compatibility_library
Как я могу хэшировать все простые пароли в базе данных, потому что я не собираюсь хэшировать 2000 1 на 1.
Я предполагаю, что могу написать скрипт, который будет обновлять все записи в базе данных, используя библиотеку паролей.
<?php
// you should put your db connection stuff here
require('connect.php');
//you create a new column to store hashed passwords. Good idea if
//something goes bad. You should drop the column with the original
// passwords once every thing is ok and done.
$result = mysqli_query(
$conn,
'alter table users add column hashed_password varchar(255) not null'
);
if ($result===FALSE)
{
// handle error here
}
$result = mysqli_query($conn, 'select * from users');
if ($result===FALSE)
{
// handle error here
}else
{
while($user = mysqli_fetch_assoc($result)
{
// you could use PASSWORD_DEFAULT here but I wouldn't. If in a
// future migration the default password crypt function changes
// your system won't work and it will be hard to know why.
$hashedPassword = password_hash($user['password'], PASSWORD_BCRYPT);
$result2 = mysqli_query($conn,'update users set hashed_password = \''. mysqli_real_escape_string($hashedPassword) .'\' where id=\''. $user['id'] .'\'');
if ($result2 === FALSE)
{
//handle error here
}
}
}
тогда вы просто проверяете пароль в hashed_password
колонка а не оригинал. Если все идет хорошо, и вы можете войти без проблем, вы можете удалить столбец исходных паролей, и все готово.
PHP теперь имеет hash_password () функция, которая использует BCrypt.
Это должно быть легко написать в несколько строк.
foreach($users as $user) {
$hashed = password_hash($user->password, PASSWORD_DEFAULT);
echo "Hashed user {$user->id}\n";
// Do db query here
}
Взгляни на password_verify () тоже!