SHA-1对密码存储是否安全?

时间:2010-05-05 09:38:10

标签: cryptography hash sha1

结论: SHA-1和preimage攻击一样安全,但它很容易计算,这意味着更容易安装暴力攻击或字典攻击。 (对于像SHA-256这样的后继者来说也是如此。)根据具体情况,设计成计算成本高的哈希函数(如bcrypt)可能是更好的选择。


有些人抛出像“SHA-1被打破”这样的评论很多,所以我试图理解这究竟是什么意思。假设我有一个SHA-1密码哈希的数据库,一个攻击者使用最先进的SHA-1破解算法和一个拥有100,000台机器的僵尸网络可以访问它。 (控制超过10万台家用电脑意味着他们每秒可以完成大约10 ^ 15次操作。)他们需要多长时间

  1. 找出任何一个用户的密码?
  2. 找出给定用户的密码?
  3. 找出所有用户的密码?
  4. 找到以其中一个用户身份登录的方法吗?
  5. 找到以特定用户身份登录的方法吗?
  6. 如果密码被腌制,它会如何改变?盐渍化的方法(前缀,后缀,两者,还是像xor-ing这样复杂的东西)是否很重要?

    这是我目前的理解,经过一些谷歌搜索。如果我误解了某些内容,请在答案中更正。

    • 如果没有盐,彩虹攻击会立即找到所有密码(超长密码除外)。
    • 如果有足够长的随机盐,找出密码的最有效方法是蛮力或字典攻击。碰撞和preimage攻击都没有找到实际密码的任何帮助,因此对SHA-1的加密攻击在这里没有帮助。使用什么算法甚至不重要 - 人们甚至可以使用MD5或MD4,密码也同样安全(因为计算SHA-1哈希的速度较慢)。
    • 为了评估“同样安全”的安全性,我们假设单个sha1运行需要1000次操作,密码包含大写,小写和数字(即60个字符)。这意味着攻击者每天可以测试10个 15 * 60 * 60 * 24 / 1000~ = 10 17 潜在密码。对于暴力攻击,这意味着在3小时内测试最多9个字符的所有密码,一周最多10个字符,一年最多11个字符。 (每增加一个角色需要花费60倍。)字典攻击速度要快得多(即使是一台计算机的攻击者也可以在几小时内完成它),但只能找到弱密码。
    • 要以用户身份登录,攻击者无需查找确切的密码;它足以找到导致相同哈希的字符串。这被称为第一次原像攻击。据我所知,没有针对SHA-1的preimage攻击。 (暴力攻击将需要2次 160 操作,这意味着我们的理论攻击者将需要10次 30 年才能将其拉下来。理论上可能性的限制大约为2 60 操作,攻击需要几年时间。)preimage attacks against reduced versions of SHA-1的效果可以忽略不计(对于减少的SHA-1,使用44步而不是80步,攻击时间从2 160 操作至2 157 )。有一些针对SHA-1的碰撞攻击,这些攻击完全在理论上可能(the best I found将时间从2 80 降低到2 52 ),但那些是没用的反对密码哈希,即使没有腌制。

    简而言之,使用SHA-1存储密码似乎非常安全。我错过了什么吗?

    更新:Marcelo指出了一篇提及a second preimage attack in 2106 operations的文章。 (编辑:作为Thomas explains,这种攻击是一种假设的结构,不适用于现实场景。)我仍然没有看到这对于使用SHA的危险性如何但是,1作为密钥导出函数。通常有充分的理由认为碰撞攻击或第二次原始图像攻击最终会变成第一次原始图像攻击吗?

7 个答案:

答案 0 :(得分:206)

答案 1 :(得分:30)

以前的答案没有提及GPU,它可以平行化SHA-1哈希,以至于整个数据库现在可以在几分钟或几小时而不是几天或几周内强制强制,即使密码已经过盐腌。

现代密码哈希算法(如bcrypt或scrypt)专门设计为难以在GPU上运行,因为它们是具有更高内存要求的分组密码(并且GPU中的内存访问不能与其相同)程度)。它们还具有“工作功能”,随着技术的进步,它们可以随时变慢。

简而言之,您应该只使用最好的工具来完成工作。 SHA-1与现有技术水平相差甚远。

进一步阅读:

答案 2 :(得分:7)

您的描述对于当前的技术水平来说听起来很准确。

你不应该使用任何散列函数的单次迭代:至少,你应该多次迭代(散列的1000次迭代会使攻击者的工作增加1000倍。它会使你的工作增加一倍数量,但你的密码散列要少得多。)

但是,理想情况下,您应该使用现有的密码存储原语,例如here所述的原语。

答案 3 :(得分:6)

SHA1是消息摘要从不意味着密码散列(或密钥派生)功能。 (虽然它可以用作KDF的构建块,例如在带有HMAC-SHA1的PBKDF2中。)

密码散列函数应该防止字典攻击和彩虹表。已经设计了几种算法来实现这一目标。

目前,最好的选择可能是 Argon2 。这一系列的密码散列函数赢得了2015年的密码哈希竞赛。

如果 Argon2 不可用,则唯一的其他标准化密码哈希或密钥派生功能是 PBKDF2 ,这是一个古老的NIST标准。如果不需要使用标准,则还有其他选择,包括 bcrypt scrypt

维基百科有这些功能的页面:

答案 4 :(得分:4)

在SHA-1中发现了严重的漏洞,使搜索速度比暴力破解快得多。它仍然在很大程度上是难以处理的,但预计不会出现太长时间的情况;偏执的程序员喜欢SHA-2家族的东西。

关于2005年原始结果的this article

  

“是时候走路了,但没有跑到火灾出口处。你看不到烟雾,但是火警已经消失了。”

目前的密码分析并不是说SHA-1不安全,而是加密社区担心更糟糕的消息可能就在眼前。这种恐惧也适用于SHA-2,它具有与SHA-1相同的缺陷,虽然在更大的搜索空间上,因此正在不断寻求SHA-3

简而言之,SHA-1现在是安全的,可能会持续一段时间,但加密社区对预后感到不安。

答案 5 :(得分:4)

截至2017年2月,SHA-1不再被视为安全。谷歌已报告对完整的非缩减轮次SHA-1(link to report)的碰撞攻击取得了成功。谷歌的公告click here

编辑:正如其他人所指出的,密码不容易受到哈希冲突的攻击。但是作为一般准则,我不会选择SHA-1作为安全相关的应用程序。那里有更好的选择。

答案 6 :(得分:3)

如果您存储盐渍密码,SHA-1可以用于实际目的。 SHA-2被认为更安全,但SHA-1不是问题,除非你有理由成为真正的偏执狂。

以下是NIST says

  

迄今为止在SHA-1上提供的结果   不要把它的安全称为   题。但是,由于进步   技术方面,NIST计划逐步淘汰   SHA-1支持更大和更大   更强的哈希函数(SHA-224,   SHA-256,SHA-384和SHA-512)   2010。