Вы, вероятно, не можете изменить схему хеширования паролей сейчас, если вы не храните пароли в виде простого текста. Что вы можете сделать, это повторно хэшировать пароли участников, используя лучшую схему хеширования после , когда каждый пользователь успешно вошел в систему.
Вы можете попробовать это:
Сначала добавьте новый столбец в свою таблицу участников, или в какой таблице хранятся пароли.
ALTER TABLE members ADD is_pass_upgraded tinyint(1) default 0;
Далее, в вашем коде, который аутентифицирует пользователей, добавьте дополнительную логику (я использую PHP):
<?php
$username = $_POST['username'];
$password = $_POST['password'];
$auth_success = authenticateUser($username, $password);
if (!$auth_success) {
/**
* They entered the wrong username/password. Redirect them back
* to the login page.
*/
} else {
/**
* Check to see if the member's password has been upgraded yet
*/
$username = mysql_real_escape_string($username);
$sql = "SELECT id FROM members WHERE username = '$username' AND is_pass_upgraded = 0 LIMIT 1";
$results = mysql_query($sql);
/**
* Getting any results from the query means their password hasn't been
* upgraded yet. We will upgrade it now.
*/
if (mysql_num_rows($results) > 0) {
/**
* Generate a new password hash using your new algorithm. That's
* what the generateNewPasswordHash() function does.
*/
$password = generateNewPasswordHash($password);
$password = mysql_real_escape_string($password);
/**
* Now that we have a new password hash, we'll update the member table
* with the new password hash, and change the is_pass_upgraded flag.
*/
$sql = "UPDATE members SET password = '$password', is_pass_upgraded = 1 WHERE username = '$username' LIMIT 1";
mysql_query($sql);
}
}
Ваша функция authenticateUser () должна быть изменена на что-то похожее на это:
<?php
function authenticateUser($username, $password)
{
$username = mysql_real_escape_string($username);
/**
* We need password hashes using your old system (md5 for example)
* and your new system.
*/
$old_password_hashed = md5($password);
$new_password_hashed = generateBetterPasswordHash($password);
$old_password_hashed = mysql_real_escape_string($old_password_hashed);
$new_password_hashed = mysql_real_escape_string($new_password_hashed);
$sql = "SELECT *
FROM members
WHERE username = '$username'
AND
(
(is_pass_upgraded = 0 AND password = '$old_password_hashed')
OR
(is_pass_upgraded = 1 AND password = '$new_password_hashed')
)
LIMIT 1";
$results = mysql_query($sql);
if (mysql_num_rows($results) > 0) {
$row = mysql_fetch_assoc($results);
startUserSession($row);
return true;
} else {
return false;
}
}
У этого подхода есть свои плюсы и минусы. С другой стороны, пароль отдельного участника становится более безопасным после того, как он вошел в систему. Недостатком является то, что все пароли не защищены.
Я бы сделал это только на 2 недели. Я отправляю электронное письмо всем своим членам и говорю им, что у них есть 2 недели, чтобы войти в свою учетную запись из-за обновлений сайта. Если они не смогут войти в систему в течение 2 недель, им потребуется использовать систему восстановления пароля для сброса пароля.