Подписаться:
$users->setSalt(md5(time()));
$encoder = new MessageDigestPasswordEncoder('sha1', true, 1);
$password = $encoder->encodePassword($users->getPassword(), $users->getSalt());
$users->setPassword($password);
Результат примерно такой: qSmJxDmP8WhVJZIiJpeVLJFLnio =
Итак, пароль в безопасности. Но как проверить, что это тот же пароль, когда пользователь пытается войти?
(пароль пришел из формы, он равен паролю в базе данных)
Я запутался, потому что есть соль, которая каждый раз уникальна.
Какая техника лучше?
Комментарий @ Deepak правильный. Соль не должен быть уникальным для каждого запроса. Он должен быть уникальным универсально и почти постоянно назначаться учетной записи пользователя.
Вы сохраняете то же самое солт-значение, которое использовалось для создания хэша пароля, когда пароль был установлен.
Затем, когда вы проверяете пароль, предоставленный пользователем, вы используете то же значение соли, вычисляете новый хеш и сравниваете его с сохраненным хешем. Если они совпадают, у вас есть победитель.
Ваши пароли хранятся в виде солей, нет?
session_start ();
Иметь функцию logIn () для проверки каждого безопасного действия с помощью logOut (), запрашивать вашу БД по имени пользователя из $ _POST [‘username’] или $ _SESSION [‘username’]
$user = DB_QUERY_BY_USERNAME;
if ( !$user ) { logOut(); }
if ( $_POST['username'] && $_POST['password'] )
{
if ( $user['password'] != md5( $_POST['password'] . $user['salt'] ) )
{
logOut();
}
}
else if ( $_SESSION['username'] != $user['username'] )
{
logOut();
}
// Logged in, renew cookies, update DB, set $_SESSION variables
$_SESSION['username'] = $user['username'];