场景:一个包含散列和加盐密码的数据库,包括每个密码的加盐,被恶意用户窃取。密码长度为 6-10 个字符,由非技术用户选择。
这个恶意用户可以破解这些密码吗?
我的理解是 MD5 和 SHA-1 不再安全,因为 GPU 辅助的密码恢复工具可以在每个 GPU 每秒计算数十亿个这些哈希值。
SHA-256 或 SHA-512 呢?他们目前安全吗?几年后呢?
场景:一个包含散列和加盐密码的数据库,包括每个密码的加盐,被恶意用户窃取。密码长度为 6-10 个字符,由非技术用户选择。
这个恶意用户可以破解这些密码吗?
我的理解是 MD5 和 SHA-1 不再安全,因为 GPU 辅助的密码恢复工具可以在每个 GPU 每秒计算数十亿个这些哈希值。
SHA-256 或 SHA-512 呢?他们目前安全吗?几年后呢?
该问题没有说明执行了多少轮散列。整个答案取决于这一点。
如果只使用一次迭代,所有散列函数都是不安全的。哈希函数,无论是 SHA-1 还是 SHA-2 系列之一,都应该重复数千次。我认为最少需要 10,000 次迭代,考虑到强大硬件的低成本,100,000 次迭代并非不合理。
短密码也是不安全的。最少 8 个字符,即使对于低价值目标也是如此(因为用户在多个应用程序中重复使用相同的密码)。
使用 150 美元的显卡,您每秒可以执行 6.8 亿次 SHA-1 哈希计算。如果您只使用一轮散列,则可以在 15 分钟多一点的时间内测试所有6 个字符的密码(假设使用了所有 94 个可打印的 ASCII 字符)。每个额外的字符将时间乘以 94,因此在此设置中 7 个字符需要 1 天,8 个字符需要 103 天。请记住,这个场景是一个 14 岁的孩子使用他的 GPU,而不是一个有真钱的有组织犯罪分子。
现在考虑执行多次迭代的效果。如果执行 1,000 次散列迭代,则 6 个字符的密码空间需要将近 12 天而不是 15 分钟。一个 7 个字符的空格需要 3 年。如果使用 20,000 次迭代,这些数字将分别达到 8 个月和 60 年。此时,即使是短密码也无法穷尽搜索;攻击者必须退回到“最有可能”密码的字典。
根据定义,盐实际上可以被认为是公共的。
至于使用什么哈希以及它有多“安全”,我会坚持 NIST 为美国政府机构提出的建议。正如维基百科文章所说:
SHA-1 已不再用于大多数政府用途;美国国家标准与技术研究院表示,“联邦机构应尽快停止将 SHA-1 用于...需要抗碰撞性的应用程序,并且必须在 2010 年之后将 SHA-2 系列哈希函数用于这些应用程序”
您可以推测各种算法的安全性或不安全性,但是当您拥有美国政府认为足以供自己使用的规范时,为什么还要打扰呢?
[编辑]
顺便说一句,您的问题似乎反映了对如何执行这些分析的误解。散列函数的意义远不止它的位数。
暴力破解 SHA-1 之类的 160 位哈希需要 2^160 的努力;不管你扔了多少“GPU”,这根本不会发生。事实上,它可能不会在宇宙的有生之年发生。(确实,暴力碰撞需要“仅” 2^80 的努力。但它也需要 2^80存储。祝你好运。)
MD5 和 SHA-1 被认为“可能不安全”的原因是,在每种算法中都发现了可能减少工作方式的弱点,远低于蛮力努力。切换到更新算法(如 SHA-2)的原因是为了避免那些已知的弱点;使用 256 位的原因是为了针对未知的弱点提供一些缓冲。它与“GPU”无关;为了抵抗蛮力攻击,160位就足够了。
顺便说一句,类似的陈述适用于所有密码学。
现在,再怎么夸大 NSA 的人对这些东西的了解比你或我多多少都不为过。他们通过 NIST 为美国政府机构和美国工业界提出建议。因此,除非您的对手本身就是一个主要的世界政府,否则 NIST 的建议就绰绰有余了。忽略任何试图告诉您其他情况的自称“专家”的人;NSA 在其工作上的表现超出您的想象。
如果你的对手是世界主要政府,那么 SO 没有人有资格帮助你。而且你有比使用哪个散列函数更大的问题。
[编辑 2]
当然,我假设您已经将此函数用作标准密码散列方案的一部分,例如PKCS#5(也称为“PBKDF2”),而您的问题纯粹是关于使用什么散列函数。
PBKDF2 建议至少 1000 次迭代,但您可以选择任何您想要的。攻击者的暴力破解努力与该数字呈线性关系,因此 10000 次迭代与 1000 次意味着暴力破解每个密码需要 10 倍的时间。
如果攻击者知道盐,他/她可以根据盐值计算出新的彩虹表。
这取决于所使用的算法。根据Coda Hale的说法,MD5 和 SHA 系列散列算法是通用的,旨在提高速度。简而言之,他继续得出结论,这些不足以防止字典攻击,并且 bcrypt 是要走的路,因为破解密码需要更多的设置时间,从而大大减慢了攻击者的速度。这是关于bcrypt的另一篇有趣的文章。
SHA-256 或 SHA-512 呢?他们目前安全吗?几年后呢?
请注意,这个论点有两个方面。有bcrypt端和SHA-256及上端。如果您相信 SHA 家族的那些人,那么我相信您使用 SHA-256 会安全几年以上,甚至有人认为 SHA-1 加盐仍然足够好,但如果您想成为安全,那么我会坚持使用 SHA-256。有一个论坛也提到MD5还有5-10年的时间被证明“足够不可靠”。不幸的是,我无法发布指向它的链接,因为我已经达到了最多两个。
就个人而言,我使用的是 SHA-256 和盐,但我肯定需要更多地阅读 bcrypt 并重新评估。希望这会有所帮助。这是一种您可以轻松花费无数时间研究的问题,但仍然很有趣。
salt的目的是防止使用ranbow table进行攻击。如果攻击者知道盐,他/她可以根据盐值计算出新的彩虹表。
所以简短的回答是肯定的。Salt被盗将使攻击者能够对这些凭据使用彩虹表攻击(尽管攻击者必须首先构建一个唯一的彩虹表)。
长答案将取决于这些密码的复杂程度。如果用户使用简单的密码(stackoverflow),那么盐被盗对密码的影响会更大。如果用户使用复杂的密码($TACK0verflow),那么被盗的盐的影响会小得多(因为它们不太可能出现在任何彩虹表中)。