结论: SHA-1和preimage攻击一样安全,但它很容易计算,这意味着更容易安装暴力攻击或字典攻击。 (对于像SHA-256这样的后继者来说也是如此。)根据具体情况,设计成计算成本高的哈希函数(如bcrypt)可能是更好的选择。
有些人抛出像“SHA-1被打破”这样的评论很多,所以我试图理解这究竟是什么意思。假设我有一个SHA-1密码哈希的数据库,一个攻击者使用最先进的SHA-1破解算法和一个拥有100,000台机器的僵尸网络可以访问它。 (控制超过10万台家用电脑意味着他们每秒可以完成大约10 ^ 15次操作。)他们需要多长时间
如果密码被腌制,它会如何改变?盐渍化的方法(前缀,后缀,两者,还是像xor-ing这样复杂的东西)是否很重要?
这是我目前的理解,经过一些谷歌搜索。如果我误解了某些内容,请在答案中更正。
简而言之,使用SHA-1存储密码似乎非常安全。我错过了什么吗?
更新:Marcelo指出了一篇提及a second preimage attack in 2106 operations的文章。 (编辑:作为Thomas explains,这种攻击是一种假设的结构,不适用于现实场景。)我仍然没有看到这对于使用SHA的危险性如何但是,1作为密钥导出函数。通常有充分的理由认为碰撞攻击或第二次原始图像攻击最终会变成第一次原始图像攻击吗?
答案 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。