hash() 与 crypt() 函数比较


hash() vs. crypt() function comparison

我目前正在实施一个登录系统。我想将密码和盐存储在数据库中。现在我发现有一个hash()和一个crypt()函数似乎做同样的事情(对 SHA512 有效)。

hash()是较新的,似乎支持比crypt()更多的哈希算法。或者我应该知道/关心任何其他差异?

编辑:

function generatePasswordHash($password){
    $salt = base64_encode(mcrypt_create_iv(8));
    $calculatedPasswordHash = crypt($password, '$1$' . $salt . '$');
    return $calculatedPasswordHash;
}

结果看起来像$1$Qh6ByGJ9$zLn3yq62egvmc9D7SzA2u.

这是我的密码检查功能:

function checkLoginData($username, $password){
    global $db;
    $sql = "SELECT * FROM users WHERE username = :username";
    $result = $db->ExecuteQuery($sql, array("username"=>$username));
    if(!empty($result)){
        $result = $result[0];
        $savedPasswordHash = $result['password'];
        $splitted = explode("$", $savedPasswordHash);
        $salt = $splitted[2];
        $calculatedPasswordHash = crypt($password, '$1$' . $salt . '$');
        if($savedPasswordHash === $calculatedPasswordHash){
            return true;
        }
    }
    return false;
}

使用 hash 进行哈希处理,例如在完整性检查中。它直接使用指定的哈希算法。

crypt是一种特殊用途的功能。它用于密码哈希和密钥派生。您需要传入一个盐,这间接决定了所使用的哈希方案。即使您选择CRYPT_SHA512也不是普通的SHA512。它是一个使用 SHA512 作为构建块的关键派生函数。特别是这样的方案故意缓慢(隐藏暴力攻击),并以安全的方式结合盐和密码。

对于日志系统中的密码哈希,crypt显然是正确的选择。