Как проверить, ввел ли пользователь пароль, соответствующий хешу Whirlpool?

Я только недавно начал изучать шифрование пароля. Мой текущий код выглядит так:

<?php
define('salt','7hPqMO(m=F+!!L6(#Yhp-CdF, &Q}+cIrA;c@wcP(E--V<qRmq!v*aSnM;H=4cD0');
$password = "CatsRsoCool47";
$myHash = hash( 'whirlpool',salt.$password );

echo $myHash;
?>

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

Кроме того, каков самый безопасный способ получения соли? Текущая соль, которую я имею, является статической и одинаковой для каждого пользователя. Должен ли я сделать что-то вроде

$salt = Time()+'7hPqMO(m=F+!!L6(#Yhp-CdF, &Q}+cIrA;c@wcP(E--V<qRmq!v*aSnM;H';

Если бы это было сделано так, мне бы не пришлось хранить метку времени в базе данных для каждого пользователя. Разве это не недостаток безопасности?

Я заблудился.... Пожалуйста, предложите лучший способ хеширования и проверки паролей. Скрипт было бы неплохо посмотреть:) Этот вопрос также может быть возможным дублированием, если так, то я очень сожалею

1 ответ

Решение

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

Затем вы можете проверить, что два значения соли + хеша совпадают.

Это так просто - сделайте одно и то же с двумя паролями, и вы получите одинаковый результат.

Вы правы, что беспокоитесь об использовании одной и той же соли каждый раз. Что вы действительно хотите сделать, это использовать разные соли каждый раз. Затем вы можете хранить соль вместе с паролем. Звучит нелогично, но это совершенно нормально. Наличие соли не позволяет вам перевернуть хэш, так как процесс в любом случае необратим.

Затем, когда вы хотите проверить пароль, вы ищите пользователя, получаете его соль, используете его для применения хеша, а затем проверяете, что вы в итоге получите по его сохраненному хешу.

Например (используя постоянную соль), вы можете получить что-то вроде:

<?php
define('salt','7hPqMO(m=F+!!L6(#Yhp-CdF, &Q}+cIrA;c@wcP(E--V<qRmq!v*aSnM;H=4cD0');

$incomingPassword = $_POST['password'];
$storedHash = getStoredHash( $_POST['username'] );

$incomingHash = hash( 'whirlpool',salt.$incomingPassword );

if ( $incomingHash == $storedHash ) {
  echo('Passwords match!');
}

?>

Надеюсь, легко увидеть, как вы можете использовать эту технику с подвижной солью.

Обратите внимание - это не шифрование - весь смысл в том, что метод является одним из способов. Вы генерируете что-то, что не может быть использовано для получения действительного пароля. Шифрование подразумевает, что процесс обратим.

Атаки на хешированные пароли выполняются так называемой "радужной таблицей".

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

Наличие одной соли облегчает эту задачу, поскольку методика идентична для каждого пароля. Если вы используете разные соли для каждой строки, то у техники есть случайный фактор, означающий, что атакующему нужна НАМНОГО большая радужная таблица, чтобы атаковать вас - по сути, таблица в натуральную величину на строку.

Другие вопросы по тегам