使用crypt(),我的应用程序如何验证随机生成盐的密码?

jlm*_*kes 3 php passwords hash

我一直在关注PHP的crypt函数和Stackoverflow上的一些问题,而我正试图找出salted和hashed密码.

我在PHP社区页面上找到了这个:

<?php
function md5crypt($password){
    // create a salt that ensures crypt creates an md5 hash
    $base64_alphabet='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
                    .'abcdefghijklmnopqrstuvwxyz0123456789+/';
    $salt='$1$';
    for($i=0; $i<9; $i++){
        $salt.=$base64_alphabet[rand(0,63)];
    }
    // return the crypt md5 password
    return crypt($password,$salt.'$');
}
?>
Run Code Online (Sandbox Code Playgroud)

这样的事情与以下相比如何:

<?php
// Slightly modified example from PHP community page

$password = trim(mysql_prep($_POST['password']));

// Get the hash, letting the salt be automatically generated
$hashed_password = crypt($password);
?>
Run Code Online (Sandbox Code Playgroud)

以下是另一个问题的摘录:

但是,PHP crypt()函数可以使用各种不同的哈希值来计算哈希值.当您使用"$ 1 $"为盐添加前缀时,您将获得带有MD5的哈希值.当你用$ 2 $加前缀时,你会得到一个带有河豚的地穴,这样更安全.

"$ 1 $"以输出为前缀,以便验证散列.如果没有包含,则无法从存储的哈希中知道应该使用哪种算法!这些信息必须存储在其他地方.为了节省您的麻烦,PHP在哈希输出中包含了算法.

我的头脑有点关于哈希,加密和盐...但真正让我感到困惑的部分是,我如何比较一个用户输入passwordsalted hashed password,如果盐是在用户创建时随机生成的...而不是存储 - 最重要的是,如果你必须指定正确的前缀以便能够在用户返回时再次验证密码,那么将crypt()与自动盐一起使用有什么意义呢?

SLa*_*aks 5

您需要与用户一起存储salt.

salt的目的是确保具有相同密码的两个用户获得不同的哈希值.
这可以防止彩虹表攻击.

编辑:您的盐应包含(加密安全)随机字节.
现在,您将其限制为仅包含字母和数字