结论: SHA-1对于图像前攻击是安全的,但是它很容易计算,这意味着它更容易安装一个暴力或者字典式攻击。(对于 SHA-256这样的继任者也是如此。)根据具体情况,设计成计算代价高昂的哈希函数(如 bcrypt)可能是更好的选择。
有些人经常说“ SHA-1坏了”,所以我想知道这到底是什么意思。假设我有一个 SHA-1密码哈希的数据库,一个拥有最先进的 SHA-1破解算法的攻击者和一个拥有100,000台机器的僵尸网络可以访问它。(拥有10万台家用电脑的控制权意味着它们可以每秒执行10 ^ 15次操作。)他们需要多长时间
- 找出任何一个用户的密码?
- 找出给定用户的密码?
- 找出所有用户的密码?
- 找到作为用户之一登录的方法?
- 找到以特定用户身份登录的方法?
如果密码被加了盐,这种情况会发生什么变化呢?Salting (前缀,后缀,两者都有,或者像 xor-ing 这样更复杂的东西)的方法重要吗?
以下是我目前的理解,经过一些谷歌搜索。如果我误解了什么,请在回答中纠正。
- 如果没有} ,彩虹攻击将立即找到所有密码(除了极长的密码)。
- 如果有一个足够长的随机盐,找到密码的最有效的方法是暴力或字典式攻击。无论是碰撞攻击还是前像攻击都无助于找到实际的密码,因此针对 SHA-1的加密攻击在这里都没有帮助。使用什么算法并不重要——甚至可以使用 MD5或 MD4,密码也同样安全(因为计算 SHA-1散列比较慢,所以略有不同)。
- 为了评估“一样安全”的安全程度,假设一次 sha1运行需要1000个操作,密码包含大写、小写和数字(即60个字符)。这意味着攻击者每天可以测试10156060 * 24/1000 ~ = 1017潜在密码。对于一个穷举法来说,这意味着在3小时内测试所有密码最多9个字符,一周内测试最多10个字符,一年内测试最多11个字符。(每增加一个字符需要60倍的时间。)字典式攻击的速度要快得多(即使只有一台电脑的攻击者也能在几个小时内完成) ,但只能找到弱密码。
- 要以用户身份登录,攻击者不需要找到确切的密码; 只需找到导致相同散列的字符串即可。这被称为第一次前像攻击。据我所知,没有针对 SHA-1的图像前攻击。(暴力攻击需要2160操作,这意味着我们的理论攻击者需要1030年才能完成。理论上可能性的极限大约是260操作,在这种情况下,攻击将需要几年时间。)针对 SHA-1简化版本的前像攻击的效果可以忽略不计(对于使用44步而不是80步的简化 SHA-1,攻击时间从2160操作下降到2157)。有一些针对 SHA-1的碰撞攻击在理论上是可行的(我找到的最好的将时间从280减少到252) ,但是这些攻击对密码哈希来说是无用的,即使没有加盐。
简而言之,用 SHA-1存储密码看起来非常安全。我错过了什么吗?
更新: 马塞洛指出了一篇提到 在2 < sup > 106 操作中的第二次前像攻击的文章。(编辑:作为 托马斯解释道,这种攻击是一种假设的结构,不适用于现实生活中的场景。)不过我还是不明白这对于 SHa-1作为密钥导出函数的使用有什么危险。一般来说,是否有充分的理由认为一个碰撞攻击或第二个前像攻击最终会变成第一个前像攻击?