Хэш с солью в функции

#php #function #hash #salt

#php #функция #хэш #соль

Вопрос:

прошу прощения за плохое использование английского… У меня возникла проблема с созданием функции, которая хэширует мой пароль с помощью соли (при первом использовании соли). Проблема в том, что я не знаю, как действительно вернуть соленый / хэшированный пароль из функции.

Мой код:

 # Password hashing with a salt.
function hashing($stringPassword) 
{
    // Making a random uniq code as salt.
    $salt = uniqid(mt_rand(), true);

    $HASH512 = hash('SHA512', $stringPassword);
    $hashPassword = $salt.$HASH512;

    return $stringPassword;
}
  

И как я пытался это протестировать:

 <?php
$stringPassword = '482301';
hashing($stringPassword);
echo $hashPassword;
?>
  

Спасибо за помощь!

Комментарии:

1. Что … что ты делаешь? Вы не возвращаете ничего полезного из своей функции, и вы вызываете функцию, не сохраняя ее выходные данные в переменной любого типа. Пожалуйста, начните с базового руководства по PHP.

2. Можете ли вы объяснить проблему, с которой вы столкнулись? Второй фрагмент кода должен отображать длинную строку символов — разве это не то, что вы ожидали?

3. @Kryten Второй фрагмент кода не должен отображать ничего в том виде, в котором он написан в данный момент

4. @ceejayoz Спасибо за ответ, но это мне не помогает… Если я повторяю $HashPassword, я ничего не получаю, я знаю, что это неправильно, но я не знаю, как это исправить

5. @ceejayoz ах, ты прав. Я неправильно это понял. : p

Ответ №1:

Ваш код написан в обратном направлении. Соль должна быть частью пароля, ПРЕЖДЕ чем вы его хэшируете. и затем вам нужно вернуть хэшированный пароль И соль, чтобы позже вы могли провести правильные сравнения.

 function hashing($cleartext) {
    $salt = uniqid(mt_rand(), true);
    $hash512 = hash('SHA512', $salt . $cleartext);
    return(array('hash' => $hash512, 'salt' => $salt));
}

$foo = hashing('letmein');
echo "Salt is: $foo[salt]";
  

Комментарии:

1. Спасибо! Это помогло мне и исправило это 🙂

Ответ №2:

Поскольку вы хешируете пароли, вы должны знать, что алгоритмы SHA * не подходят для хеширования паролей. Они слишком быстры, вместо этого вам нужна функция с коэффициентом затрат, таким как BCrypt или PBKDF2, где вы можете контролировать необходимое время для вычисления.

PHP предлагает специальную функцию password_hash() для генерации хэшей BCrypt, для более ранних версий PHP вы можете использовать пакет совместимости:

 // Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);