Как войти после хеширования pw с солью?<== РЕДАКТИРОВАННАЯ ВЕРСИЯ № 2 ==> - PullRequest
3 голосов
/ 24 января 2011

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

if(!$error) {
    $alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcedfghijklmnopqrstuvwxyz1234567890";
    $rand = str_shuffle($alpha);
    $salt = substr($rand,0,40);
    $hashed_password = sha1($salt . $_POST['Password']);
    $query = "INSERT INTO `Users` (
                `FirstName`,
                `LastName`,
                `Email`,
                `Password`,
                `salt`,
                `RelationshipToCF`,
                `State`,
                `Gender`,
                `Birthday`,
                `Status`
        )VALUES(
                '" . mysql_real_escape_string($_POST['firstName']) . "',
                '" . mysql_real_escape_string($_POST['lastName']) . "',
                '" . mysql_real_escape_string($_POST['email']) . "',
                '" . $hashed_password . "',
                '" . $salt . "',
                '" . mysql_real_escape_string($_POST['RelationToCF']) . "',
                '" . mysql_real_escape_string($_POST['State']) . "',
                '" . mysql_real_escape_string($_POST['sex']) . "',
                '" . mysql_real_escape_string($_POST['DateOfBirth_Year'] . "-" . $_POST['DateOfBirth_Month'] . "-" . $_POST['DateOfBirth_Day']) . "',
                'pending'
    )";
    mysql_query($query, $connection);

Вот метод, который я использую для обновления существующих паролей:

$query = "SELECT * FROM `Users`";
$request = mysql_query($query,$connection);
while($result = mysql_fetch_array($request)) {
    $alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcedfghijklmnopqrstuvwxyz1234567890";
    $rand = str_shuffle($alpha);
    $salt = substr($rand,0,40);
    $hashed_password = sha1($salt . $result['Password']);
    $user = $result['id'];

    $query2 = "UPDATE `Users` SET `salt` = '$salt' WHERE `id` = '$user'";
    $request2 = mysql_query($query2,$connection) or die(mysql_error());
    $query3 = "UPDATE `Users` SET `encrypted_passwords` = '$hashed_password' WHERE `id` = '$user'";
    $request3 = mysql_query($query3,$connection) or die(mysql_error());
}

ИтакТеперь я хочу разрешить пользователю входить с паролем, с которым он подписан, и на данный момент он может войти только с хешированным паролем.Очевидно, что это еще не было применено к реальной базе данных.

Вот запрос на страницах входа, которые мне нужно изменить:

    if(isset($_POST['subSignIn']) &&
       !empty($_POST['email']) &&
       !empty($_POST['password'])) {

        $email = mysql_real_escape_string($_POST['email']);
        $password = mysql_real_escape_string($_POST['password']);
        $query = "SELECT
             `id`,`email`,`password` FROM `Users`
             WHERE `Email` = '" . $email . "' AND
             `Password` = '" . $password . "'  &&
             `Status` = 'active' LIMIT 1";
        $request = mysql_query($query,$connection) or die(mysql_error());

        if(@mysql_num_rows($request)) {

            $result = mysql_fetch_array($request);
            $_SESSION['LIFE']['AUTH'] = true;       
            $_SESSION['LIFE']['ID'] = $result['id'];

$query = "UPDATE `Users` SET` LastActivity` = '" . date("Y-m-d") ." " . date("g:i:s") . "'   WHERE `id` ='" .mysql_real_escape_string($_SESSION['LIFE']['ID']) . "' LIMIT 1";

            mysql_query($query,$connection);

            if(!empty($_POST['return'])) {          
                header("Location: " . $_POST['return']);        
            }else{
                header("Location: Dashboard.php?id=" . $_SESSION['LIFE']['ID']);
            }
        }else{
            $_SESSION['LIFE']['AUTH'] = false;      
            $_SESSION['LIFE']['ID'] = false;    
        }

Я искалВебернет о методах, но подумал, что я бы воспользовался всеми великими умами здесь и ловил рыбу для предложения / метода / учебника / указывал в правильном направлении

<== Моя попытка после первоначальных 5 ответов ==>

 i

f(isset($_POST['subSignIn']) && !empty($_POST['email']) && !empty($_POST['password'])) {


    $query = "SELECT id FROM cysticUsers WHERE Email = '$email' AND Password = SHA1(CONCAT(salt,'$password')) AND Status = 'active' LIMIT 1";
    $request = mysql_query($query,$connection) or die(mysql_error());

if(@mysql_num_rows($request)) {

        $row = mysql_fetch_assoc($request);
        if (sha1($row['salt'] . $_POST['password']) === $row['password']) {


        $_SESSION['CLIFE']['AUTH'] = true;
        $_SESSION['CLIFE']['ID'] = $result['id'];

        // UPDATE LAST ACTIVITY FOR USER
        $query = "UPDATE `cysticUsers` SET `LastActivity` = '" . date("Y-m-d") . " " . date("g:i:s") . "' WHERE `id` = '" . mysql_real_escape_string($_SESSION['CLIFE']['ID']) . "' LIMIT 1";
        mysql_query($query,$connection);

        if(!empty($_POST['return'])) {
            header("Location: " . $_POST['return']);

        }else{
            header("Location: CysticLife-Dashboard.php?id=" . $_SESSION['CLIFE']['ID']);
            }
        }

    }else{

        $_SESSION['CLIFE']['AUTH'] = false;
        $_SESSION['CLIFE']['ID'] = false;

    }
}

?>

Ответы [ 5 ]

3 голосов
/ 24 января 2011

Если вы хотите проверить введенный пароль, вы должны сделать то же самое, что и с оригинальным паролем: перед сольтом и хэшем это значение.

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

$query = "SELECT `salt`, `password` FROM `Users` WHERE `Email` = '" . $email . "'";
$request = mysql_query($query,$connection) or die(mysql_error());
if (mysql_num_rows($request)) {
    $row = mysql_fetch_assoc($request);
    if (sha1($row['salt'] . $_POST['Password']) === $row['password']) {
        // user authentic
    } else {
        // user not authentic
    }
}

Если они совпадают, то введенный пароль, вероятно, 1 такой же, как и введенный оригинал.


1) Вероятно, это то же самое и не совсем одно и то же, потому что всегда существует вероятность столкновения , когда два входных значения имеют одинаковое значение хеш-функции.

3 голосов
/ 24 января 2011

У меня нет времени, чтобы пройти через все блоки кода, но базовая проверка соли / хеша выглядит следующим образом:

$user         // User has a $password and a $salt. $password = hash($plaintext . $salt);
$password     // Password we are checking.
return $user->password == hash($password . $user->salt);
1 голос
/ 24 января 2011

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

В первом блоке кода:

$hashed_password = sha1($salt . $result['Password']);

должно выглядеть примерно так:

$hashed_password = sha1($salt . $_POST['Password']);

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

1 голос
/ 24 января 2011

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

$query = "SELECT salt FROM Users WHERE username='$user'";
$result = mysql_query($query) or die ("AAAAGH!  *Thud*");
$row = mysql_fetch_assoc($result);
$salty_password = sha1($row['salt'], $_POST['password']);
$query = "SELECT * FROM users WHERE username='$user' AND password='$salty_password'";
$result = mysql_query($query) or die ("AAAAGH!  *Thud*");
if (mysql_num_rows($result)) {
    echo "Successfully authenticated!";
}
else {
    echo "Failed to Authenticate.";
}
1 голос
/ 24 января 2011

Можете ли вы сделать свой третий кодовый блок более читабельным?


Вот как я могу это сделать -
  • Зашифруйте его при регистрации, сохраните пароль + соль.
  • Когда они входят в систему, получают соль, связанную с именем пользователя, в которое они пытаются войти.
  • Хешируйте пароль, который они ввели (при входе) с солью из базы данных.
  • Сравните пароль для входа с паролем в базе данных.

Должно быть легко.

Например:

$hashed_password = sha1($salt . $result['Password']);

Храните $hashed_password и $salt в своей базе данных.

Когда они войдут в систему, пароль, с которым вы сравните $hashed_password, будет примерно таким:

$password = sha1($row['salt'] . $_POST['password']);

Имеет смысл?

...