password_hash()
(http://php.net/manual/en/function.password-hash.php)的PHP手册说:
使用的算法,成本和salt作为哈希的一部分返回。因此,验证散列所需的所有信息都包含在其中。
我的问题是:为什么?
我在另一个SO答案中读到了这个:(Static Salt vs Random Salt - Security PHP)
随机盐具有巨大的益处。如果系统中的所有帐户都使用相同的盐,则攻击者可以强制计算该盐的哈希值,并且只需一次计算就可以进入所有帐户。
我明白了。但是,password_hash()
将salt嵌入到返回的哈希中,我相信它会公开,因此攻击者知道每个密码的盐。
最好不要使用长的私人盐吗?
我能想到的一件事是,使用相同的盐创建的哈希值对于相同的密码是相同的,并且可能允许攻击者通过对数据库中哈希值的统计分析来取得进展。
但是,这可以通过使用私有哈希字典而不仅仅是一个来缓解,但在PHP 7中password_hash()
不再可能这样做。
我不是安全专家,我相信PHP人员知道他们正在做什么,所以我很高兴听到为什么password_hash()
方式被认为是正确的方式去吧。
答案 0 :(得分:2)
我找到了这个答案:
http://php.net/manual/en/function.password-hash.php#114410
如果您认为"为什么盐包含在哈希值中并保存 当我把它存储在我的数据库中时?"
答案我发现:盐必须是独一无二的。它并不意味着是一个 秘密。
如之前的笔记和文档中所述:让password_hash()注意 盐。
使用独特的盐可以强制攻击者破解哈希值。该 hash是唯一的,无法在彩虹表中找到。