mysql — Массовое хеширование паролей PHP-логин код проекта

У меня есть следующий вопрос / требование.

Мой сайт имеет 2000 пользователей, однако пароли хранятся в виде обычного текста (я знаю, что это очень плохо). Прочитав различные блоги на сайте, я обнаружил, что мне нужно использовать современное хеширование паролей и засолку. я нашел php-login.net . Они используют современное соление / перемешивание.

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

Мое главное требование — я хочу хэшировать все мои текущие пароли в виде простого текста. Вход в php с использованием библиотеки совместимости паролей php.

password_compatibility_library

Как я могу хэшировать все простые пароли в базе данных, потому что я не собираюсь хэшировать 2000 1 на 1.

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

2

Решение

<?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 колонка а не оригинал. Если все идет хорошо, и вы можете войти без проблем, вы можете удалить столбец исходных паролей, и все готово.

3

Другие решения

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 () тоже!

2

По вопросам рекламы [email protected]