我只是在阅读一篇关于创建登录系统的帖子,在阅读时我看到了密码散列。
我们将存储一个 sha256 哈希值,它是一个始终包含 64 个字符的字符串。
这篇文章正在教使用sha256哈希函数。读完之后,我并没有停下来,开始搜索更多关于创建安全登录系统的内容,然后我想出了wikiHow 的这篇文章。在本文中,他们使用sha512哈希函数。这让我很困惑,我将在下一个登录系统中使用哪个功能。我仍然在 google 上搜索更好的文章,并通过crackstation找到了这篇文章。作者推荐sha256和sha512。
只能使用加密散列函数来实现密码散列。SHA256、SHA512、RipeMD 和 WHIRLPOOL 等哈希函数是加密哈希函数。
我以为我的搜索已经结束,我可以使用sha256
或sha512
运行,但在搜索更多时,我发现了这个SO Question。罗伯特 K接受的答案对我来说有新的东西。关于我以前从未听说过的事情是bcrypt和scrypt。
所有这些东西都是大约 2 到 4 年前写的。
题
现在用于 PHP 的最佳密码散列算法是什么?
这里的主要问题是您想选择一个慢的散列。对于这些散列中的任何一个,唯一可行的攻击向量是暴力破解。这意味着,攻击者只能一个接一个地尝试所有可能的密码,使用与您相同的算法对它们进行散列,并将它们与散列进行比较。一个密码花费的时间越长,找到匹配项就越不可行。
SHA 系列算法设计得很快,因为它们并非设计用于此目的。因此,它们本身有点不适合密码散列;尽管它们可以用作使它们适合的算法的一部分,例如PBKDF2(简而言之,它会重复散列数千次以拉伸它)。
bcrypt 和 scrypt 被明确设计为很慢,因此更适合密码散列。bcrypt 被设计为在 CPU 能力方面非常昂贵,而 scrypt 被设计为在内存消耗方面非常昂贵。与内存相比,使用当今的硬件可以更好地扩展 CPU 能力,因此 scrypt 目前被认为是最好的选择。尽管目前它非常前沿,并且在可用代码方面几乎没有得到支持。另一方面,PHP 支持password_hash
直接使用 bcrypt 。