在函数中用盐哈希

时间:2014-06-20 21:42:55

标签: php function hash salt

我很抱歉英语的使用不好......我遇到了一个问题,即使用盐(第一次使用盐)制作一个哈希密码的功能。 问题是我不知道如何从函数中真正返回salted / hashed密码。

我的代码:

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

您的代码是倒退的。在哈希之前,盐必须是密码的一部分。然后你需要返回哈希密码和盐,以便以后可以进行适当的比较。

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 :(得分:1)

由于您正在散列密码,因此您应该知道SHA *算法不适合散列密码。它们太快了,你需要一个像BCrypt或PBKDF2这样的成本因子的函数,你可以控制计算所需的时间。

PHP提供专用函数password_hash()来生成BCrypt哈希值,对于早期的PHP版本,您可以使用compatibility pack

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