1

我想使用便携式 PHP 密码散列框架来散列密码。但我发现它的演示不使用盐来散列密码。但它使用虚拟盐来检查密码,我觉得这很奇怪,我根本不明白这个想法,

$dummy_salt = '$2a$08$1234567890123456789012';

if (isset($dummy_salt) && strlen($hash) < 20)
        $hash = $dummy_salt;

我想知道,如果我想使用可以生成唯一盐并将其存储在我的数据库中的每个用户的约定方法,我该如何使用便携式 PHP 密码散列框架来生成盐?

这是我用来散列密码的函数,但有人告诉我 sha512 与 sha1 有相同的问题,明智的做法是信任像便携式 PHP 密码散列框架这样的专家,

function hash_sha512($phrase,&$salt = null)
{
    //$pepper = '!@#$%^&*()_+=-{}][;";/?<>.,';

    if ($salt == '')
    {
        $salt = substr(hash('sha512',uniqid(rand(), true).PEPPER_KEY.microtime()), 0, SALT_LENGTH);
    }
    else
    {
        $salt = substr($salt, 0, SALT_LENGTH);
    }

    return hash('sha512',$salt.PEPPER_KEY.$phrase);
}

如果您有任何想法,请告诉我。谢谢。

4

1 回答 1

4

从链接到该页面的phpass 文章中:

除了实际的散列,phpass 在新密码或密码被散列时透明地生成随机盐,并将散列类型、盐和密码拉伸迭代计数编码到它返回的“散列编码字符串”中。当 phpass 针对存储的散列验证密码或密码短语时,它同样透明地提取并使用散列类型标识符、盐和“散列编码字符串”中的迭代计数。因此,您无需自己费心腌制和拉伸 - phpass 会为您处理这些

...因此这些示例不使用盐渍也就不足为奇了!您可能对代码进行了过度调味。

带有虚拟盐的代码示例是一个示例,说明如何通过确保用户是否存在来防止定时攻击,用户的验证花费相同的时间,有效地通过对不存在进行虚拟身份验证用户。它需要一个虚拟盐,因为如果用户不存在,它就没有存储的盐可供使用。

于 2011-01-26T15:05:59.857 回答