鉴于有多少主要网站被黑客入侵并且他们的密码数据库被解密,什么是保护身份验证的最佳方法?
基本上,我感兴趣的是一种保护成员访问网站的一部分的方法,如果被黑客入侵,在任何情况下都不会让黑客获得用户的密码。
没有什么是无懈可击的,但至少让它很难破解。
http://codahale.com/how-to-safely-store-a-password/
bcrypt
使用bcrypt。使用bcrypt。使用bcrypt。使用bcrypt。使用bcrypt。使用bcrypt。使用bcrypt。使用bcrypt。使用bcrypt。
MD5
, SHA1
, SHA256
, , SHA512
, SHA-3
, 等}?这些都是通用哈希函数,旨在在尽可能短的时间内计算出大量数据的摘要。这意味着它们非常适合确保数据的完整性,而存储密码则完全是垃圾。
现代服务器每秒可以计算大约 330MB 的 MD5 哈希值 。如果您的用户的密码是小写字母数字和 6 个字符长,您可以在大约 40 秒内尝试该大小的每个可能的密码。
这是没有任何投资的。
如果你愿意花大约 2,000 美元和一两个星期来购买 CUDA,你可以组建你自己的小型超级计算机集群,它可以让你 每秒尝试大约 700,000,000 个密码。并且,您将以每秒超过 1 个的速度破解这些密码。
重要的是要注意盐对于防止字典攻击或暴力攻击是无用的。您可以使用大量盐或多种盐或手工收获的、阴凉种植的有机喜马拉雅粉红盐。考虑到数据库中的哈希和盐,它不会影响攻击者尝试候选密码的速度。
盐与否,如果您使用的是为速度而设计的通用哈希函数,那么您会得到很好的效果。
bcrypt
解决这些问题如何?基本上,它慢得要命。它使用 Blowfish 加密算法的密钥调度的变体,并引入了一个工作因子,它允许您确定散列函数的成本。正因为如此,bcrypt
才能跟上摩尔定律。随着计算机变得越来越快,您可以增加工作因子并且散列会变慢。
bcrypt
比,说,慢多少MD5
?取决于工作因素。使用 12 的工作系数,在我的笔记本电脑上大约 0.3 秒内bcrypt
散列密码yaaa
。MD5
,另一方面,花费不到一微秒。
所以我们说的是5个数量级左右。我不是每 40 秒破解一次密码,而是每12 年左右破解一次密码。您的密码可能不需要那种安全性,您可能需要更快的比较算法,但bcrypt
允许您选择速度和安全性之间的平衡。用它。
除了正确的密码处理(如bcrypt,如前所述),您需要在专用设备/机器上进行密码散列。
这个用于密码散列的“设备”是一个单独的系统,其中包含所谓的“本地参数”,它是散列函数的额外输入(例如,128 位强随机数)。主机系统(您的应用程序,它执行用户身份验证)必须无法读取此本地参数。
如果您的密码数据库/应用程序受到威胁,使用这样的专用机器进行密码散列可以为您购买额外的安全层。