我花了几个小时在SO上搜索了一些关于在PHP/MySQL中处理密码的最安全方法的帖子后,提出了这个问题。大多数答案似乎都过时了,人们指向的链接也是如此。许多人推荐md5和sha-1。
我们都知道MD5和SHA-1不再值得使用,因为它们已经被逆转,也因为有许多数据库已经建立了数百万个MD5/sha1字符串。现在,很明显,你可以用盐来解决这个问题,我打算这样做
然而,我最近开始玩漩涡游戏,它看起来更安全,而且是最新的。我认为漩涡+盐足以保护密码,这是对的吗?
实际上我在考虑这样的事情:
<?php
$static_salt = 'some_static_salt_string_hard_coded';
$password = 'some_password_here';
$salt = 'unique_salt_generated_here';
$encoded = hash('whirlpool', $static_salt.$password.$salt);
?>
你觉得怎么样?过度杀人还是明智?
对于大多数应用程序来说,这可能已经足够好了。
然而,如果您的数据库被泄露,salts(几乎)会变得毫无用处——如果您的配置文件也被泄露,则包括静态salts。它们对彩虹表是一个很好的保护,但现在使用一堆GPU对给定的哈希进行暴力攻击更容易了。
IMHO,目前最好的解决方案是使用bcrypt。它显然在PHP 5.3+中得到了支持,下面是一个如何使用它的示例。
这就足够了(但是,静态硬编码的salt没有意义)。为什么不使用SHA256呢?惠而浦很少使用。
如果不更广泛地考虑威胁模型和实现的细节,讨论特定算法的优点尤其没有意义。
是的,就杂碎的有效性而言,漩涡似乎确实有一些优势,但正如尼克莱所说,这可能是欺骗性的,因为它的使用范围较小。但也有其他考虑因素——出于某些目的,为每个帐户存储128个字符的字符串可能是不必要的开销。对于每个人来说,这都是软件支持什么的问题(有些人可能想使用相同的帐户记录来控制对不同系统的访问)。
归根结底,你的哈希算法有多复杂并不重要:
- 用户可以自由选择,选择错误的、可猜测的密码
- 用户将对不同的服务使用相同的密码
如果它对你有效——那就太好了——但没有通用的解决方案。