散列()与隐窝()函数比较(hash() vs. crypt() function comparis

2019-06-23 20:44发布

我目前正在执行一个登录系统。 我想存储的密码,并在数据库中的盐。 现在我发现有一个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;
}

Answer 1:

使用hash的散列,例如完整性检查。 它直接使用指定的哈希算法。

crypt是特殊用途功能。 它用于密码哈希和密钥导出。 你需要的盐,这也间接决定了使用的哈希方案通过。 即使您选择CRYPT_SHA512这不是普通的SHA512。 这是一个使用SHA512作为构建模块密钥导出功能。 特别地,这种方案是故意慢(藏起来的强力攻击),并以安全的方式结合了盐和密码。

对于在日志系统密码散列, crypt显然是正确的选择。



文章来源: hash() vs. crypt() function comparison