使用便携式 PHP 密码散列框架创建 salt

lau*_*kok 1 php hash hashcode password-protection salt-creation

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

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

if (isset($dummy_salt) && strlen($hash) < 20)
        $hash = $dummy_salt;
Run Code Online (Sandbox Code Playgroud)

我想知道,如果我想使用可以生成唯一盐并将其存储在我的数据库中的每个用户的约定方法,我如何使用便携式 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);
}
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*son 5

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

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

...所以这些例子不使用盐渍也就不足为奇了!您可能对代码过度调味。

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