更新:有一种添加服务器端密钥的更好方法,而不是将其用作辣椒。使用辣椒,攻击者必须在服务器上获得额外的权限才能获取密钥。通过首先计算哈希值,然后使用服务器端密钥加密哈希值(双向加密),我们可以获得同样的优势。这使我们可以选择在必要时交换密钥。
对于在数据库中散列密码,我想在散列函数中添加一个胡椒。当然,这种辣椒将是另外一种独特的盐。
我想添加辣椒的原因是,它可以防止字典攻击,以防攻击者只能访问数据库,而不能访问服务器(典型的 Sql-Injection)。在我看来,这比没有辣椒的哈希要好,即使辣椒只是硬编码(以避免代码复杂性)。
现在我想知道,应该如何正确应用辣椒,在散列之前将辣椒附加到密码中是否正确?
1.连接密码和辣椒
$passwordHash = bcrypt($password . $pepper, $salt);
反对这种情况的一个原因可能是,大于 bcrypt 限制(55 个字符)的密码将无法获得成功,尽管这种长度的密码可能不在字典中。由于这个限制,辣椒是在密码之后而不是之前添加的。另一个原因可能是,如果攻击者知道胡椒,他也知道我们所有胡椒密码的结尾。
2.将密码和胡椒与哈希结合起来
$passwordHash = bcrypt(hash('sha256', $password . $pepper), $salt);
所以我们可以在散列之前使用散列函数来组合密码和胡椒。当我们以后想使用 bcrypt 时,是否适合使用 sha256,或者哪个哈希函数是理想的?
3.将密码和胡椒与hmac结合起来
$passwordHash = bcrypt(hash_hmac('sha256', $password, $pepper), $salt);
通常建议使用 hmac 解决方案,与直接使用 SHA256 相比有什么优势吗?由于我们只想结合密码和胡椒,而安全性后来来自 bcrypt,我看不到任何明显的优势。
非常感谢任何有用的提示。