Php 这是地穴的好用途吗?

Php 这是地穴的好用途吗?,php,crypt,Php,Crypt,我正在升级我的auth类,将存储密码的md5替换为crypt。以下是我采取的方法: function crypt_pass($pass, $userID) { $salt = $userID .'usesomesillystringforsalt'; // min 22 alphanumerics, dynamic $method = (version_compare('5.3.7',PHP_VERSION,'>=')) ? '2y' : '2a'; // PHP 5.3

我正在升级我的auth类,将存储密码的
md5
替换为
crypt
。以下是我采取的方法:

function crypt_pass($pass, $userID) {
    $salt = $userID .'usesomesillystringforsalt';  // min 22 alphanumerics, dynamic
    $method = (version_compare('5.3.7',PHP_VERSION,'>=')) ? '2y' : '2a'; // PHP 5.3.7 fixed stuff
    if (CRYPT_BLOWFISH == 1) {
        $blowfish_salt = '$'. $method .'$07$'. substr($salt, 0, CRYPT_SALT_LENGTH) .'$';
        return crypt($pass, $blowfish_salt);
    }
    return sha1($pass . $salt);        
}

使salt对每个用户都唯一将添加一个步骤,即对提供的用户名的
id
进行db查找。。。我觉得这是值得的。我错了吗?还有什么我没有考虑的吗?

salt的全部目的是从同一密码生成不同的加密字符串。如果你每次都用同样的盐,这种情况就不会发生,所以你最好不要用盐。您应该为每个密码创建一个随机的新salt,然后将其与加密的salt字符串一起存储在数据库中。

这更适合您的php版本。根据您的逻辑,
5.2.17
6.0.0
@dialer-true-dat,谢谢!当我找到最好的替代方案时,我会编辑上面的内容。实际上,他们甚至不应该尝试手动创建散列。最好使用一个能让他们访问bcrypt或scrypt的库。HMAC+bcrypt是最好的选择。这里有一些好文章可以让你开始:和。第二个链接是web安全最佳实践系列的一部分。绝对推荐阅读。我不知道如何争论,但在我看来,使用用户的数据库
id
生成盐与将盐存储在同一记录中几乎是一样的。每个密码都有一个唯一的salt。我没看到什么?我没意识到你在salt中也使用了
id
-应该读得更好:)