使用便携式PHP密码哈希框架创建盐
-
24-10-2019 - |
题
我想用 便携式PHP密码哈希框架 进行哈希密码。但是我发现它的演示不会使用盐来放置密码。但是它使用虚拟盐来检查密码,我觉得这很奇怪,我根本不明白这个想法,
$dummy_salt = '$2a$08$1234567890123456789012';
if (isset($dummy_salt) && strlen($hash) < 20)
$hash = $dummy_salt;
我想知道,如果我想使用会议方法,我可以在数据库中生成唯一的盐并为每个用户存储它,如何使用便携式PHP密码哈希框架生成盐?
这是我用来哈希密码的功能,但有人告诉我SHA512与SHA1有相同的问题,明智地信任专家,例如Portable 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);
}
让我知道您是否有任何想法。谢谢。
解决方案
来自 Phpass文章 从该页面链接到:
除了实际的哈希外,PHPARS还会在哈希(Hash)上透明地生成随机盐,并将其编码返回的“编码字符串”中的Hash类型,盐和密码伸展的迭代计数。当PhPARS针对存储的哈希(Hash)对密码或密码键进行身份验证时,它类似地透明地提取并使用哈希类型标识符,盐和迭代中的迭代计数,从“ Hash编码字符串”中计算出来。 因此,您无需打扰自己的盐和伸展 - Phphas为您照顾这些.
...因此,这些例子不使用盐就不足为奇了!您可能正在过度调整代码。
带有虚拟盐的代码样本是如何通过确保用户是否存在来防止定时攻击的一个示例用户。它需要虚拟盐,因为如果用户不存在,则不会使用储存的盐。
不隶属于 StackOverflow