#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);