【问题标题】:Vulnerability of serial self-hashing串行自哈希的漏洞
【发布时间】:2019-12-20 22:19:15
【问题描述】:

是否存在与自散列相关的漏洞?

假设我想保留一个 md5 哈希密码的数据库。问题是大多数人会使用简单的密码,如“密码”、“管理员”等,这些都是反向 md5 查找服务的主要候选者。我的想法是散列哈希,即:

password  = 'admin'
md5(password) = 0x21232f297a57a5a743894a0e4a801fc3
md5(md5(password)) = 0xc3284d0f94606de1fd2af172aba15bf3

在现实生活中我们使用盐。但是以上是不是一个坏主意,它真的带来了固有的缺陷吗?

【问题讨论】:

  • 是的,这是一个非常的坏主意。无盐,容易受到彩虹表的攻击,在 GPU 中实现暴力破解的速度非常快,而且哈希非常容易,笔记本电脑可以对其进行字典攻击。除非您是密码学家,否则不要发明自己的哈希方案,请使用 bcrypt。
  • 好的,但是除了它很容易预先计算之外,没有其他漏洞了吗?这是否意味着破解“hellobatteryhorseshoefriend”是不可行的?

标签: passwords md5 password-hash


【解决方案1】:

使用您自己想出的任何方案来存储密码本质上都不如使用密码学家专门设计的密码存储方案之一安全。散列方案存在许多潜在的漏洞,可以通过这种方式加以预防,包括易受暴力攻击或字典攻击、导致散列函数减弱的数学问题(例如 MD5)和其他问题。

具体来说,MD5(即使使用 Salt 或多轮)非常不安全,因此即使是“好”的密码也可以在几秒钟内被暴力破解。 您不应该将使用 MD5 散列的密码存储在任何地方!

例如,在我的笔记本上使用hashcat,我每秒可以暴力破解大约 18 亿个 MD5 哈希值。通过使用一个或多个 GPU 或利用有关密码的更多知识(例如使用预先计算的彩虹表或使用字典单词的变体),这个数字可以显着增加几个数量级。

因此,您应该始终使用专为密码存储而设计的现代哈希算法,而不是使用通用哈希函数,具体来说,是以下之一:

  • 氩气2
  • 加密
  • Bcrypt
  • PBKDF2

这些算法中的每一个都是专门为密码散列设计的,即“慢”到不允许简单和/或廉价的暴力攻击。

对于大多数可用的语言,都有支持任何这些算法的成熟库。如果有疑问,请尝试为您的编程语言使用基于 libsodium 的库。一般来说,您应该使用适用于您的编程语言或框架的安全解决方案,而不是发明自己的方案。

请参阅https://libsodium.gitbook.io/doc/password_hashing,详细了解密码哈希的挑战和可用的现代解决方案。

【讨论】:

  • 好的,我特意寻找解释为什么这是一个坏主意,而不是太多替代方案:)
  • 查看我的答案的更新。不过,请注意 MD5 不应在任何地方使用。即使作为常规哈希函数(用于数据,而不是密码),它在多年前就已经完全被破坏了。使用 MD5,您可以例如很容易发现冲突(即多个不同的输入字符串导致相同的哈希),这可能会在现实世界的系统中导致很多问题。
  • 顺便说一句,如果您使用 md5 来提高速度,请改用 blake2b - 它甚至比 md5 更快,但提供类似于 SHA3 的安全性。 (不过,不要使用这些哈希值作为密码)
【解决方案2】:

密码破解者通常开箱即用地支持双重哈希,请查看hashcat's Algorithms 部分。

即使使用更聪明的方案,您也应该知道,使用良好的 GPU 可以暴力破解 100 Giga MD5 per second。如果您对更深入的信息感兴趣,可以看看我的tutorial 关于安全密码存储。

【讨论】:

    猜你喜欢
    • 2019-05-18
    • 2020-10-24
    • 1970-01-01
    • 2012-06-14
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    相关资源
    最近更新 更多