但是问题仍然存在,行业目前认为“足够好”是什么?可以使用哪些参考点进行比较?
我已经找到了一些参考点:
2000年9月-建议进行1000多轮测试(来源:RFC 2898)
2005年2月-Kerberos 5中的AES“默认”为4096轮SHA-1。 (来源:RFC 3962)
2010年9月-ElcomSoft声称iOS 3.x使用2,000次迭代,iOS 4.x使用10,000次迭代,显示BlackBerry使用1次(未声明确切的哈希算法)(来源:ElcomSoft)
2011年5月-LastPass使用100,000次SHA-256迭代(来源:LastPass)
2015年6月-StableBit使用200,000次SHA-512迭代(来源:StableBit CloudDrive螺母和螺栓)
2015年8月-CloudBerry使用SHA-1的1,000次迭代(来源:CloudBerry Lab安全注意事项(pdf))
对于您如何确定多少次迭代对应用程序“足够好”,我将不胜感激。 。
作为其他背景,我正在考虑使用PBKDF2-SHA256作为对用户密码进行哈希处理以存储具有安全意识的网站的方法。我计划的PBKDF2盐是:每个用户的随机盐(与每个用户记录一起存储在明文中)与全局盐进行XOR。目的是增加暴力破解密码的成本,并避免泄露具有相同密码的用户对。
参考文献:
RFC 2898:PKCS#5 :基于密码的密码规范v2.0
RFC 3962:针对Kerberos 5的高级加密标准(AES)加密
PBKDF2:基于密码的密钥派生功能v2
#1 楼
您应在应用程序中使用性能允许的最大回合数。轮数是一个减慢因子,您可以在正常使用情况下使用这种减慢因子,这种减慢对您的影响微不足道(用户不会看到它,额外的CPU成本并不意味着购买更大的服务器,并且依此类推)。这在很大程度上取决于操作上下文:涉及什么机器,每秒有多少用户身份验证...,因此没有一种千篇一律的响应。这样就可以看到: br />
在系统上验证单个密码的时间是v。您可以通过选择PBKDF2中的回合数来调整时间。
潜在的攻击者可以获得的CPU能力是您的f倍(例如,您有一台服务器,攻击者拥有100台大型PC,每台PC的速度快两倍)比您的服务器高:f = 200)。
普通用户的密码为熵n位(这意味着尝试猜测带有“合理密码”字典的用户密码)的平均时间为2n-1次尝试。)
如果平均密码破解时间少于p(这是攻击者的“耐心”),攻击者将发现您的系统值得攻击。
您的目标是使破坏单个密码的平均成本超出了攻击者的耐心,使攻击者甚至没有尝试,而是继续专注于另一个更简单的目标。使用上面详述的符号,这意味着您想要:
v·2n-1> f·p
p是您无法控制的;可以根据受用户密码保护的数据和系统的价值进行估算。假设p为一个月(如果花费一个多月,则攻击者将不会尝试尝试)。您可以通过购买更大的服务器来缩小f的数量。另一方面,攻击者将尝试通过购买更大的计算机来使f更大。令人沮丧的一点是,密码破解是一项令人尴尬的并行任务,因此攻击者将使用支持常规编程的GPU来获得很大的提升。因此典型的f仍会在几百个数量级的范围内。
n与密码的质量有关,您可以通过严格的密码选择策略以某种方式对其进行影响,但实际上,您将拥有很难获得大于32位的n值。如果您尝试强制使用更强的密码,则用户将开始采取积极的措施,例如从其他地方重用密码,在便笺上写入密码等等。
因此其余参数为v。如果f = 200(一个拥有十几个优秀GPU的攻击者),一个月的耐心且n = 32,则您需要v至少为241毫秒(注意:我最初在此处写的是“ 8毫秒”,这是错误的- -这是耐心的一天而不是一个月的数字。因此,您应该在PBKDF2中设置回合数,以便通过单个密码进行计算至少需要花费服务器上那么多时间。您仍然可以使用单个内核每秒验证四个密码,因此对CPU的影响可以忽略不计(*)。实际上,使用更多轮比较安全,因为,让我们面对现实,从平均用户密码中获取价值32位的熵有点乐观;另一方面,很少有攻击会花费一个月的时间将数十台PC用于破解单个密码的任务,因此也许一天的“攻击者的耐心”更为现实,导致8毫秒的密码验证成本。
所以您需要制定一些基准。此外,只要您的PBKDF2 / SHA-256实现速度很快,上述方法就可以工作。例如,如果您使用完全基于C#/ Java的实现,对于CPU密集型任务,您将获得典型的2到3的减速因子(与C或汇编语言相比);在上面的表示法中,这等效于将f乘以2或3。作为比较基准,2.4 GHz Core2 CPU每秒可以执行约230万次基本SHA-256计算(使用单个内核),因此这意味着,在该CPU上大约需要20000回合才能实现“ 8毫秒”的目标。
(*)注意,使密码验证更加昂贵也使您的服务器更容易遭到拒绝攻击。 -服务攻击。您应该应用一些基本的对策,例如将每秒发送过多请求的客户端IP地址暂时列入黑名单。无论如何,您都需要这样做,以阻止在线字典攻击。
评论
+1是一个很好的答案,如果可以的话,我还要再给+1提供一个尴尬的并行链接:-)
–约翰
2011年5月20日12:59
这是思考的好方法-谢谢!
–尾巴
2011年5月24日,0:21
只是一个想法:在客户端PC上可以进行约20k次回合,而在服务器上要进行1k次就可以了吗?如果攻击者从猜测“正常密码”开始,他仍将必须进行21k发。而且如果他从钥匙开始,他只需要进行1k次回合,但是熵应该更高。我想念什么吗?对我来说似乎是一个很好的解决方案。
–cooky451
2012年12月4日17:16
@ cooky451:您可以执行此操作,但这可能很难配置。客户可以使用各种各样的硬件,其中有些在计算方面非常薄弱。另外,在Web上下文中,这意味着使用Javascript,并且您不会从PBKDF2的Javascript实现中得到很多迭代(它与Java applet一起使用会更好,但这是另一种蠕虫病毒)。
–托马斯·波宁(Thomas Pornin)
2012年12月4日17:24
我不明白您在示例中如何达到8毫秒。如果f = 200,则p = 30 * 24 * 60 * 60 * 1000?,n = 32。那么v是241ms?我将1个月变成了毫。不知道我在做什么错。感谢你的回答
–何塞·罗曼尼洛(JoséF. Romaniello)
14年8月26日在21:12
#2 楼
在命令行上运行openssl speed
,以了解消息摘要功能的运行速度。我可以计算出我的四核2.2GHz沙桥上每秒约160万个sha256散列值或每天约1,450亿个猜测。如果某人的密码在英语词典中并且使用了一轮sha256,则将单词列表从磁盘上加载所需的时间要比遍历该列表破坏散列的时间更长。如果您对PKBDF2-SHA256进行了数十万次发声,则可能需要几分钟才能中断。实施强壮的密码策略会有所帮助。真正的答案:您需要燃烧多少时间?
评论
好点。 openssl速度-不错!但是,如果以每秒200万次的速度进行200,000轮,那么每秒仅10轮。一本有十万个单词的小型词典将花费几个小时。但是,是的,即使经过很多回合,错误的密码也是错误的……。
–nealmcb
2011年5月20日下午4:26
@迈克尔固定。
–rook
2014年10月4日在22:23
#3 楼
托马斯的答案提供了有用的基线模型和数据。但是他提出的目标对我来说没有意义。一个典型的攻击者直到实际入侵该站点并获取哈希数据库之后才知道您的迭代次数。这样做之后,它们不会继续下去,因为您使用了大量的迭代次数。他们将尝试破解尽可能多的东西,并且很可能会公开散列,以便其他人将继续尝试破解这些年来,以提供越来越强大的硬件。因此,“ p”和“ f”都将在黑客入侵后很长一段时间内继续增加。此外,真实的用户密码也无法通过32位熵之类的复杂性度量很好地建模。文章“可重用安全性:有关密码安全性度量的新论文”在这方面很有帮助,并记录了我们长期以来所知的内容:许多用户选择易于猜测的密码,并且存在一个长尾巴。这也意味着,如果攻击者足够努力,他们总会找到一些东西。
我想说,一个更可能的目标是尽可能多地保护用户的密码免遭破解。例如。 PDF的表4.2.1显示,如果您在某些攻击活动中设法将攻击者的攻击次数从每次哈希平均100万次尝试限制为50万次尝试,则可以保护5%的用户密码(假设与比8个字符以上的密码多7个字符的密码,因此将破解百分比从35%降低到30%)。当然,曲线的确切形状以及它们在曲线上的位置会有很大的不同。
所以,我只求可以预算的最大迭代次数,只要它不延迟实际用户进行正常登录。随着您计算能力的不断提高,您应该增加价值。
#4 楼
将此视为很长的评论。我很好奇这些东西在我的个人笔记本电脑(Thinkpad T460p,Intel i7-6700HQ)上运行的速度如何。我知道要破解固定密码会有一些特殊的设备,但是如果您有Web服务,则可能没有特殊的硬件。评估结果
默认值当前(2019年6月1日)的
werkzeug.security.generate_password_hash
的数量是pbkdf2:sha256:150000
。如您所见,执行时间随着回合/迭代次数的增加而线性增加。这意味着默认值在我的计算机上平均花费约281ms。
sha512, 1 iteration : min: 67.1μs, mean: 72.2μs, max: 310.9μs
sha512, 15000 iteration: min: 38462.8μs, mean: 40291.2μs, max: 44842.4μs
sha256, 15000 iteration: min: 27167.6μs, mean: 28118.0μs, max: 30826.0μs
sha512, 1000 iteration: min: 2636.7μs, mean: 2694.3μs, max: 3579.0μs
sha256, 1000 iteration: min: 1870.7μs, mean: 1888.8μs, max: 2477.0μs
md5, 15000 iteration: min: 21126.2μs, mean: 21864.8μs, max: 23799.3μs
sha512, 1 iteration : min: 23.4μs, mean: 26.9μs, max: 40.6μs
sha512, 1000 iteration: min: 2586.7μs, mean: 2761.1μs, max: 3120.6μs
sha256, 1000 iteration: min: 1823.3μs, mean: 1834.6μs, max: 2008.5μs
sha512, 15000 iteration: min: 38507.9μs, mean: 40210.8μs, max: 47430.3μs
sha256, 15000 iteration: min: 27257.1μs, mean: 28454.0μs, max: 31213.5μs
md5, 15000 iteration: min: 21219.9μs, mean: 21842.4μs, max: 24305.0μs
代码
#5 楼
配备8个当前GPU的现代机器将每秒计算90亿个SHA-256哈希,或每天约777万亿哈希,这些GPU可以执行基于规则的字典攻击。评论
作为对此的更新,2014年10月,根据https://hashcat.net/oclhashcat/,该8 GPU机器的速度高达每秒123亿个SHA-256哈希(和每秒45亿个SHA-512哈希) ,使用AMD R9 290X GPU。
–反弱密码
2014-12-28 19:55
现在有什么更新统计信息?
–克里希纳·潘迪(Krishna Pandey)
17年5月2日,9:33
每gist.github.com/epixoip/a83d38f412b4737e99bbef804a270c40 SHA-256〜每秒230亿哈希,SHA-512〜86亿哈希每秒,使用8倍Nvidia GTX 1080
–生锈
17年5月3日在21:52
评论
尽管我将其标记为“已回答”,但是仍然感谢所有记录其他应用程序使用了多少次迭代的引用...谢谢。全局盐不会对彩虹表增加任何额外的保护。如果您正在使用全局盐来防止脱机破解尝试,则可能需要考虑使用HMAC。另外,考虑使用bcrypt或scrypt代替PBKDF2-SHA256,因为它们的设计明确目的是缓慢散列密码。
对于来到这里的每个人的强制性说明:如今,您应该认真考虑使用比PKBDF2更好的密钥扩展算法,因为它具有高度可解析性。认为Argon2是最新的东西(2015年的赢家),或者是scrypt。