哪种是PHP最好的密码哈希算法?

3
我刚刚在阅读有关创建登录系统的文章时,看到了有关密码散列的内容。

我们将存储一个 sha256 哈希值,它是始终包含 64 个字符的字符串。

这篇文章教授使用sha256哈希函数。阅读完后,我没有停下来,开始搜索更多有关创建安全登录系统的资料,然后我找到了wikiHow的这篇文章。在这篇文章中,他们使用sha512哈希函数。这真的让我感到困惑,不知道我应该为我的下一个登录系统使用哪个函数。我仍然在谷歌上搜索更好的文章,并找到了crackstation的这篇文章。作者推荐使用 sha256 和 sha512 两种哈希函数。
只有加密哈希函数才能用于实现密码哈希。像SHA256、SHA512、RipeMD和WHIRLPOOL这样的哈希函数是加密哈希函数。 我以为我的搜索结束了,我可以使用sha256或sha512函数,但在继续搜索时,我发现了这个SO Question。被Robert K接受的答案对我来说有新的东西。这些是我以前从未听说过的bcryptscrypt的事情。 所有这些东西都是大约2到4年前写的。 问题 哪种密码哈希算法是这些天用于PHP的最佳选择?

我认为需要使用多个变量。例如:sha1($username . '-' . $password); - Lkopo
2
@userNOID:还不够。你应该也阅读一下链接的问题。 - Madara's Ghost
还可以查看Openwall的Portable PHP密码哈希框架(PHPass)。它经过加固,能够抵御许多常见的用户密码攻击。 - jww
1个回答

9
重点在于选择一个的哈希算法。这些哈希算法的唯一可行攻击向量是暴力破解。这意味着,攻击者只能一个接一个地尝试所有可能的密码,使用与您相同的算法进行散列,并将它们与哈希值进行比较。对于一个密码来说,这需要更长的时间,因此要找到匹配项就越不可行。

SHA算法族被设计为快速,因为它们不是为了这个目的而设计的。因此,它们本身就不太适合用于密码哈希;尽管它们可以作为算法的一部分使用,使它们变得适合,例如PBKDF2(简单来说,重复多次哈希以拉伸它)。

bcrypt和scrypt明确地设计成慢的,因此更适合用于密码哈希。bcrypt旨在在CPU功率方面非常昂贵,而scrypt旨在在内存消耗方面非常昂贵。使用今天的硬件,CPU功率可以更好地扩展,因此scrypt目前被认为是最好的选择。尽管它目前非常前沿,并且在可用代码方面得到了很少的支持。另一方面,bcrypt则通过PHP直接使用password_hash得到支持。


1
为什么不呢?这个问题明确涉及SHAcrypt之间的区别,因此对这个问题给出简洁的答案并不是坏事,不是吗? - deceze
1
好的,是的,另一个答案很棒。不过它相当冗长,因此我仍然认为提供一个简明扼要、简单明了的答案,特别是关于算法之间的区别以及为什么有些算法比其他算法更好,是有价值的。 - deceze
@deceze,你有一个很好的解释,但是你有一篇关于“bcrypt”和“scrypt”的更详细的文章可以阅读吗? - Muhammad Talha Akbar
@Muhammad 不是很清楚。但 Blowfish(bcrypt)已经在许多地方得到了充分的讨论,Google 应该足够了。至于 scrypt,我找到了这个有趣的解释:http://www.youtube.com/watch?v=gICktQu1ySU - deceze
@Muhammad 你是什么意思?这会让他的CPU长时间繁忙。 - deceze
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接