Passwords 串行自哈希漏洞

Passwords 串行自哈希漏洞,passwords,md5,password-hash,Passwords,Md5,Password Hash,是否存在与自哈希相关的漏洞 假设我想保留一个md5哈希密码数据库。问题是,大多数人会使用简单的pws,如“密码”、“管理员”等,所有这些都是反向md5查找服务的主要候选。我的想法是散列散列,即: password = 'admin' md5(password) = 0x21232f297a57a5a743894a0e4a801fc3 md5(md5(password)) = 0xc3284d0f94606de1fd2af172aba15bf3 在现实生活中,我们使用盐。但是,上面提到的是一个

是否存在与自哈希相关的漏洞

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

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

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

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

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

举个例子,在我的笔记本上,我可以每秒强制执行大约18亿MD5哈希。通过使用一个或多个GPU,或利用更多关于密码的知识(例如,使用预先计算的彩虹表或使用字典单词的变体),这个数字可以显著增加几个数量级

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

  • Argon2
  • 刺耳
  • Bcrypt
  • PBKDF2
这些算法中的每一种都是专门为密码哈希而设计的,即“慢”到不允许简单和/或廉价的暴力攻击

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


有关密码哈希的挑战和可用的现代解决方案的详细信息,请参阅。密码破解者通常支持开箱即用的双重哈希,请参阅一节


即使有一个更聪明的方案,你也应该意识到,一个好的GPU可以让人动武。如果您对更深入的信息感兴趣,可以查看我的关于安全密码存储的介绍。

是的,这是一个非常糟糕的主意。不含盐份,易受rainbow表攻击,在GPU中实现暴力非常快,哈希非常容易,笔记本电脑可以对其运行字典攻击。除非你是一个密码学家,否则不要发明你自己的哈希方案,使用bcrypt.OK,但是除了它很容易预计算之外,没有其他漏洞了?这是否意味着破解“hellobatteryhorseshoefriend”是不可行的?好吧,我特别想解释一下为什么这是个坏主意,没有太多的选择:)请参阅我答案的更新。不过,请注意,MD5不应在任何地方使用。即使作为一个常规的散列函数(用于数据,而不是密码),它在很多年前就已经完全被破坏了。使用MD5,您可以很容易地找到冲突(即多个不同的输入字符串导致相同的哈希),这可能会在现实世界的系统中造成许多问题。顺便说一句,如果您使用MD5提高速度,请使用blake2b,它甚至比MD5快,但提供与SHA3类似的安全性。(不过,不要将这些哈希值用作密码)