结论:SHA-1是作为对原像攻击什么是安全的,但它是很容易计算,这意味着它更容易安装包含了暴力破解或字典攻击。 (这同样适用于像SHA-256的继任者真。)根据具体情况,其目的哈希函数是计算昂贵(如bcrypt)可能是一个更好的选择。
有些人到处乱扔的言论,如“SHA-1是破”了很多,所以我想知道究竟是什么意思。 假设我有SHA-1密码哈希值的数据库,并且攻击者蒙山艺术SHA-1算法破的状态和10万吨的机器僵尸网络获得对它的访问。 (有超过10万台的家用电脑控制将意味着他们可以每秒约做10 ^ 15操作)。他们将需要多少时间来
- 找出任何一个用户的密码?
- 找出给定用户的密码?
- 找出所有用户的密码?
- 找到一种方式登录的用户之一?
- 找到一种方法,登录为特定的用户?
这种改变如何,如果密码是咸? 请问腌制的方法(前缀,后缀,这两者或更复杂的东西像异或)有关系吗?
这是我目前的理解,一些谷歌上搜索后。 请答案正确,如果我误解的东西。
- 如果没有盐,彩虹攻击会立刻发现所有的密码(除极长的)。
- 如果有一个足够长的随机盐,以找出密码的最有效的方法是蛮力或字典攻击。 无论是碰撞,也没有原像攻击是找出实际的密码任何帮助,所以密码攻击对SHA-1在这里没有帮助。 它甚至没有多大关系采用何种算法 - 一个甚至可以使用MD5或MD4和密码是一样安全(有轻微的差异,因为计算SHA-1散列较慢)。
- 为了评估如何安全“一样安全”是,让我们假设一个SHA1运行需要1000个操作和密码包含大写字母,小写字母和数字(即60个字符)。 这意味着攻击者可以测试10 15 * 60 * 60 *1000分之24〜= 10 17潜在密码一天。 对于暴力攻击,那将意味着测试所有的密码最多9个字符,在3个小时,最多10个字符在一个星期,最多11个字符的一年。 (这需要60遍之多是为了每一个附加的字符。)字典攻击是多少,更快(即使攻击者能够在一台计算机可以把它关闭以小时为单位),但只能找到弱密码。
- 要登录的用户,攻击者并不需要找出确切的密码; 它足以发现导致相同的哈希的字符串。 这就是所谓的第一原像攻击。 至于我能找到的,也有反对的SHA-1没有原像攻击。 (A暴力破解攻击需要2点160的操作,这意味着我们的理论,攻击者需要10 30年,把它关闭。的理论可能性的限制是大约2个60操作,在该攻击将需要几年的时间。)有原像攻击针对SHA-1的降低的版本的具有可忽略的影响(减小的SHA-1,其使用44层的步骤,而不是80,攻击时间是从2个160操作,以2 157向下)。 有对SHA-1的碰撞攻击,这都在理论上的可能性(在我找到了最好的带来的时间从2 80到2 52),但这些都是针对密码哈希没用,即使不加入盐。
总之,存储密码使用SHA-1似乎万无一失。 我错过了什么?
更新:马塞洛指出其中提到的一篇文章在2个106操作的第二原像攻击 。 ( 编辑:正如托马斯解释说 ,这种攻击是不适用于现实生活场景的假设结构)我还没有看到这是如何法术使用SHA-1作为密钥导出函数的危险,虽然。 是否有普遍认为的碰撞攻击或第二原像攻击可最终变成了第一原像攻击很好的理由?
简短的回答你的问题是:SHA-1是安全的,你可以得到。 MD5将被罚款过,甚至MD4; 但它可以使一些投资者感到紧张。 对于公共关系 ,最好是用一个“更好”的散列函数,如SHA-256,即使你截断其输出到160位或128位(以节省存储成本)。 一些的SHA-3轮-2候选似乎比,同时SHA-1可以说是“更安全的”更快; 但他们仍然是一个有点新的,所以坚持SHA-256和SHA-512将是一个比较安全的现在。 它会让你看起来很专业和谨慎,这是很好的。
请注意,“作为安全的,因为你可以得到”是不一样的“绝对安全”。 请参阅下面的相当冗长的解释。
关于已知的攻击:
在MD4,MD5和SHA-1的已知攻击的是关于碰撞,这不影响原像电阻。 它已经表明,MD4有试图打破HMAC / MD4时利用一些缺陷,这些缺陷可能是(理论上只),但这并不适用于您的问题。 通过Kesley和施奈尔纸的2 106第二次原像攻击是一个通用的权衡其仅适用于很长的输入(2个60字节;这是一个万TB -注意一下106 + 60超过160;这就是你看到权衡没有什么神奇的话)。
此消息的其余部分假定您使用散列函数(如SHA-1)是一个“黑盒子”与攻击者可能利用没有特殊的属性。 这就是你有什么权利现在即使有“破”散列函数MD5和SHA-1。
关于彩虹表:
“彩虹攻击”,其实就是费用分摊字典或蛮力攻击。 它是由一个微分时间内存权衡首先Hellman于1980年假设你有N个可能的密码中(这是你的字典的大小,或2 n如果考虑暴力破解哈希函数的输出n位),则在其中预先计算的N个哈希密码,并将它们存储在一张大桌子分时攻击。 如果散列输出排序,你可以在一个单一的查询获取您的密码。 彩虹表是该表存储与显着降低的空间,一个聪明的办法。 你仅存储N /吨哈希密码,并且您裂纹与O( 吨 2)查找密码。 彩虹表,将能够处理几乎比你所能切实店大得多的预计算表。
然而,彩虹与否,攻击者仍然需要至少运行一次全面出击。 这可以被看作是几个连续优化的层:
- 蛮力/字典式攻击已经花费N代表破解每个密码。
- 随着预先计算的表,攻击者支付该费用ñ 一次 ,此后可攻击多个密码,每个密码非常小的额外费用。
- 如果预先计算的表是彩虹表,则N可以稍微做大,因为存储成本降低。 N个瓶颈成为CPU功率,攻击者可以鼓起,不是他的硬碟的大小。
如果N是足够大,使得散列Ñ密码的CPU成本是可笑,那么这样的攻击是不可行的,而不管是否使用彩虹表与否。 这意味着,与80位或更多的输出的(耐原像-)散列函数是足以使蛮力攻击不可行。
关于盐:
盐是击败预先计算的方式。 在上面的描述中,盐带回攻击者到步骤1:盐析防止攻击者分享的几个密码攻击之间的O(N)的成本。 预先计算的表, 更不用说彩虹表,都不再是可行的。
你想盐析,因为当散列数据包括在密码中,即一些东西,适合随机的人的大脑内,则N可以是相当低:人类在选择记忆密码非常糟糕。 这就是“字典攻击”是关于:这是潜在的使用密码的前提是很多用户的密码将在精心挑选的空间在减小的空间(“说文解字”)。
因此盐析将至少防止攻击者使用预先计算的表,特别是预先计算的彩虹表。 这假定攻击者可以打破一个密码或两个; 我们不希望他打破其他1000个密码很少额外的开销。
此外,腌制好公共关系。
关于SHA-1费用:
SHA-1的基本成本大约是散列一个64字节块。 那怎么SHA-1的作品:数据填充,然后分成64字节的块。 处理单个块的成本是英特尔酷系统上约500个时钟周期,这是单个核心。 MD5和MD4更快,计数约400和250次循环,分别。 不要忘了,最现代的CPU有几个核,所以相应地成倍增加。
一些腌制方案规定巨大的盐; 例如什么进入散列函数是一个单一的128位盐的实际40000连续拷贝,接着密码本身。 这使得密码哈希更加昂贵(由10000与我的例子中的一个因素),无论是对合法用户和攻击者。 这是否是一个好主意,依赖于安装。 对于桌面系统上登录,这是件好事:用户甚至不会注意到它了10ms的哈希他的密码,而不是为1μs的; 但对于攻击者的成本已经由一个非常明显的因素10000上升在具有每秒数千次的客户共享服务器,总成本可能令人望而却步。 从概念上讲,提高相同的倍数酒吧为合法用户和攻击者不是最终良好的安全性; 但它可以在某些特定情况下是值得的想法。
关于在线攻击:
上述所有的约击败脱机攻击。 离线攻击是指攻击者拥有所有他为了“测试”密码需要的数据的攻击; 例如,攻击者可以得到数据库的持有哈希密码的副本。 在离线攻击中,攻击者只能通过他的计算资源的限制。 相反,将网络攻击是一种攻击,其中每个猜测攻击者必须经过一个诚实的验证(例如,攻击者只是尝试登录受攻击系统)。 在线攻击是由执行多少密码每秒可以尝试限制阻挠。 极端的例子是智能卡,其经过三个错针脚关机。
通常情况下,密码的安全性,付出总有回报得多制度安排没有让攻击者建立的脱机攻击。 这就是Unix系统做:哈希密码,这曾经是世界可读/etc/password
文件,现在在/etc/shadow
被保护,防止读取访问,但被少数特权应用程序文件。 这里的假设是,如果攻击者可以读取/etc/shadow
,那么他可能有过系统,他并不真的需要密码了足够的控制...
以前的答案,不要让GPU的任何提及,可parallellise SHA-1散列到整个数据库,现在可以蛮力强行在几分钟或几小时而不是几天或几周内,即使密码被腌制的程度。
现代密码哈希算法,如bcrypt或scrypt是由于这样的事实,它们具有高得多的存储器要求的块密码(和在一个GPU存储器存取不能parallellised以相同的程度)专门设计是困难的在GPU上运行。 他们也有一个“功函数”,允许他们随着技术的提高来进行较慢的飞行。
总之,你应该只使用最好的工具来做。 和SHA-1落在很远短艺术的状态。
进一步阅读:
- https://crypto.stackexchange.com/questions/400/why-cant-one-implement-bcrypt-in-cuda
- http://codahale.com/how-to-safely-store-a-password/
- http://www.codinghorror.com/blog/2012/04/speed-hashing.html
- https://security.stackexchange.com/questions/4781/do-any-security-experts-recommend-bcrypt-for-password-storage/6415#6415
你的描述听起来准确的技术的当前状态。
你不应该使用任何散列函数的单次迭代,但:最起码,你应该重复多次(哈希的1000次迭代增加了攻击者的工作,1000倍它增加了相同的量的工,但。你正在做的少了很多的密码哈希比他们)。
理想的情况下,但是,你应该使用现有的密码存储原始的,如描述在这里 。
SHA1是一个消息摘要 ,它从来就不是密码散列(或密钥推导)功能。 (虽然可以使用的构建块一KDF,诸如在与PBKDF2 HMAC-SHA1)。
密码散列函数应该抵御字典攻击和彩虹表。 一些算法已被设计来实现这一目标。
目前,最好的选择可能是Argon2。 密码散列函数这家在2015年获得了密码哈希处理比赛。
如果Argon2不可用,唯一的标准化的密码散列或密钥推导功能PBKDF2,这是一个老气NIST标准。 其他的选择,如果使用的是标准不要求,包括bcrypt和scrypt。
维基百科有这些功能的页面:
- https://en.wikipedia.org/wiki/Argon2
- https://en.wikipedia.org/wiki/Bcrypt
- https://en.wikipedia.org/wiki/Scrypt
- https://en.wikipedia.org/wiki/PBKDF2
严重安全漏洞已经在SHA-1,使搜索比蛮力快得多被发现。 它在很大程度上仍然是棘手的,但预计不会有太多长的情况; 偏执的程序员有利于从SHA-2家族的东西。
从这篇文章中关于2005年最初的结果:
“现在是时候走,但不运行,消防通道。你看不到浓烟,但消防报警都跑了。”
这并不是说当前的密码分析使得SHA-1不安全,而是在加密社区担心更坏的消息可能是指日可待。 这种担心也适用于SHA-2,这在一个大得多的搜索空间表现出相同的缺陷如SHA-1,虽然,因此不断追求为SHA-3 。
总之,SHA-1是安全的,现在,可能会在一段时间来,但加密社区与预后不舒服。
截至2月2017,SHA-1应该不再被认为是安全的。 谷歌已经报道了针对全,非还原轮SHA-1(碰撞攻击成功连结回报 )。 对于谷歌的声明, 请点击此处 。
编辑:正如其他人所指出的,密码不容易被哈希冲突的攻击。 但是作为一般原则,我不会选择SHA-1安全相关的应用。 有更好的选择那里。
如果存储盐渍密码SHA-1是罚款实际用途。 SHA-2被认为是更安全的,但除非你有一个理由是真正的偏执狂SHA-1是没有问题的。
下面是NIST什么说 :
关于SHA-1为止给出的结果不调用它的安全性提出了质疑。 然而,由于技术的进步,NIST计划赞成更大,更强的散列函数相SHA-1的出(SHA-224,SHA-256,SHA-384和SHA-512),2010年。