Массовое хеширование паролей Код PHP-LOGIN PROJECT

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

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

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

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

password_compatibility_library

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

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


person Hackd O Wow    schedule 03.06.2015    source источник
comment
Я предполагаю, что могу написать скрипт, который будет обновлять все записи в базе данных, используя библиотеку паролей. Кажется, вы сами отвечаете на свой вопрос. Скрипт это ;)   -  person Blackus    schedule 03.06.2015
comment
Я не знаю, с чего начать. Мне нужно некоторое руководство о том, как я могу достичь этого.   -  person Hackd O Wow    schedule 03.06.2015
comment
Используйте bcrypt без дополнительного столбца соли. Лучший способ хранения паролей на сегодняшний день. В любом случае: просто получите всех текущих пользователей, извлеките их пароль, зашифруйте его и сохраните обратно. Я не понимаю, в чем здесь может быть проблема? Это был бы простой PHP-скрипт с ок. 5 строк кода.   -  person Blaatpraat    schedule 03.06.2015
comment
Я рекомендую добавить один столбец соли, добавить одну соль на запись, а затем написать скрипт для чтения соли на запись - > применить алгоритм кодирования для каждой записи - > сохранить его обратно в БД   -  person Mangesh Sathe    schedule 03.06.2015


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

person Ioannis Loukeris    schedule 03.06.2015
comment
Спасибо, сейчас проверю. - person Hackd O Wow; 03.06.2015
comment
Ваш код сработал хорошо, спасибо! Я также добавил кнопку, которую нужно нажать для запуска запроса. :) - person Hackd O Wow; 03.06.2015
comment
Я бы порекомендовал привязку param, а не mysqli_real_escape_string(), но в остальном хорошая штука! - person halfer; 03.06.2015
comment
Спасибо. Переход на ОО + подготовленные операторы, но пока не освоился. Кроме того, поскольку большинство людей все еще работают с mysql_*, а не с mysqli, я подумал, что за этим будет легче следить... - person Ioannis Loukeris; 04.06.2015
comment
не следует использовать VARCHAR для хеша фиксированной длины - person hanshenrik; 20.09.2016

Теперь в 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()!

person Jim Wright    schedule 03.06.2015