结论: SHA-1与任何其他对原像攻击的攻击一样安全,但是它易于计算,这意味着更容易进行暴力破解或字典攻击。(对于SHA-256之类的后继者也是如此。)根据情况的不同,散列函数的设计成本较高(例如bcrypt),可能是更好的选择。
有些人大声疾呼诸如“ SHA-1损坏”之类的言论,所以我试图理解这到底意味着什么。假设我有一个SHA-1密码哈希数据库,并且攻击者拥有最先进的SHA-1破坏算法,并且拥有100,000台机器的僵尸网络可以访问它。(对10万台家用计算机进行控制将意味着它们每秒可以执行约10 ^ 15次操作。)他们需要多少时间
- 找出任何一个用户的密码?
- 找出给定用户的密码?
- 找出所有用户的密码?
- 找到一种以用户身份登录的方法?
- 找到一种以特定用户身份登录的方法?
如果密码过大,该如何更改?加盐的方法(前缀,后缀或两者,或诸如xor-ing之类的更复杂的东西)是否重要?
经过谷歌搜索后,这是我目前的理解。如果我误解了一些内容,请纠正答案。
- 如果没有盐,彩虹攻击将立即找到所有密码(极长的密码除外)。
- 如果有足够长的随机盐,找出密码的最有效方法是蛮力攻击或字典攻击。碰撞和前映像攻击都无法帮助您找到实际的密码,因此,针对SHA-1的加密攻击没有帮助。甚至使用什么算法都没关系-甚至可以使用MD5或MD4,并且密码也一样安全(因为计算SHA-1散列的速度较慢,所以存在细微差别)。
- 为了评估“同样安全”的安全性,我们假设一次sha1运行需要1000次操作,并且密码包含大写,小写和数字(即60个字符)。这意味着攻击者每天可以测试10 15 * 60 * 60 * 24/1000〜= 10 17个潜在密码。对于蛮力攻击,这意味着要在3小时内测试所有密码,最多9个字符,一周最多测试10个字符,一年最多测试11个字符。(每个其他字符要花60倍的时间。)字典攻击的速度要快得多(即使攻击者只有一台计算机,也可以在数小时内将其删除),但只能找到弱密码。
- 要以用户身份登录,攻击者无需找出确切的密码;找到一个导致相同哈希值的字符串就足够了。这称为第一次原像攻击。据我所知,没有针对SHA-1的原像攻击。(A暴力破解攻击需要2点160的操作,这意味着我们的理论,攻击者需要10 30年,把它关闭。的理论可能性的限制是大约2个60操作,在该攻击将需要几年的时间。)有原像攻击反对SHA-1的简化版本(效果可忽略不计)(对于使用44步而不是80步的简化SHA-1,攻击时间从2160次操作减少到2157次)。有一些针对SHA-1的冲突攻击,这在理论上是可行的(我发现的最好的攻击时间从2 80降至2 52),但是对于密码哈希(即使不加盐)也没有用。
简而言之,使用SHA-1存储密码似乎非常安全。我错过了什么?
更新: Marcelo指出了一篇文章,其中提到了2 106次操作中的第二次原像攻击。(编辑:正如Thomas所解释的那样,此攻击是一种假想的构造,不适用于现实情况。)不过,我仍然看不到这对使用SHA-1作为关键派生函数的危险。通常有充分的理由认为碰撞攻击或第二原像攻击最终可以转变为第一原像攻击吗?