串行自哈希的漏洞

Vulnerability of serial self-hashing

自散列是否存在任何漏洞?

假设我想保留一个 md5 散列密码数据库。问题是大多数人会使用像 'password'、'admin' 等简单的 pws,所有这些都是反向 md5 查找服务的主要候选者。我的想法是散列散列即:

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

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

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

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

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

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

  • 氩气2
  • 加密
  • 加密
  • PBKDF2

这些算法中的每一个都是专门为密码散列而设计的,即 "slow" 不允许简单的 and/or 廉价暴力攻击。

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

请参阅 https://libsodium.gitbook.io/doc/password_hashing 了解有关密码散列的挑战和可用的现代解决方案的详细信息。

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

即使使用更聪明的方案,您也应该意识到可以暴力破解 100 Giga MD5 per second with a good GPU. If you are interested in more indepth information, you can have a look at my tutorial 关于安全密码存储的问题。