📜  散列和散列冲突的密码学介绍

📅  最后修改于: 2022-05-13 01:57:03.360000             🧑  作者: Mango

散列和散列冲突的密码学介绍

什么是哈希?
散列是将任何类型的数据(通常是密码或安装程序文件)转换为固定长度字符串的过程。散列有多种类型,但对于本文,我们将只看 MD5 散列。 MD5 是散列方法的一个示例。例如,“hello”(不带引号)的 MD5 哈希是“5d41402abc4b2a76b9719d911017c592”(不带引号)。同样,“Geeks for Geeks”(不带引号)的 MD5 哈希是“5ee878924e0cb782e0729066a7d88832”(不带引号)。您会注意到,即使“Geeks for Geeks”比“hello”长,它们的 MD5 哈希值也是相同的长度。这就是使哈希易受攻击的原因,我们将在本文后面讨论。

为什么我们使用哈希?
哈希往往有一些一般用例——

  1. 密码安全
  2. 确保正确下载
  3. 图像完整性验证

在本文中,我们将从密码安全的角度来研究散列,因为这是其最常见的用例。

密码安全:
很多时候,一个网站需要有一个登录表单来验证它的用户。通常,这些网站有很多不同的用户,需要将他们的登录信息存储在某种数据库中。但是,将密码作为明文存储在数据库中是非常不安全的。

例如,假设黑客设法进入存储在网站上的以下登录信息数据库 -

Username

Password

adminAdmin_securep@$$w0rd
johnnyappleseed123ja.5923!
zadibennov151982

从这张表中,每个用户的密码是什么变得一目了然。此外,黑客刚刚获得了管理员帐户的访问权限,现在可以控制网站的多个方面!相反,该网站决定使用其 MD5 哈希值来存储密码。探索这个场景,假设黑客设法进入了网站的新数据库。这就是他们所看到的——

UsernamePassword Hash
admin865c5895f347413ca07c81e6c365cb31
johnnyappleseed123a55805ec1caef94681bb07271659c887
zadibenae93717757ecfb103847b6752b88ed36

现在,黑客只能看到密码的哈希值,理论上无法登录这些帐户中的任何一个。如果没有实际的密码,哈希(再次,理论上)对黑客来说是无用的。但是现在,网站将如何验证其用户?网站不会根据数据库检查用户输入的密码,而是检查用户输入的密码的哈希值。如果该哈希与数据库中的哈希匹配,则用户已通过身份验证!这是因为“Admin_securep@$$w0rd”的 MD5 哈希将始终为“865c5895f347413ca07c81e6c365cb31”(更安全的哈希,如 BCrypt 使用更复杂的哈希方法以及比较两个哈希的更复杂的方法,但为简单起见,我们将坚持现在使用 MD5),虽然你总是可以从密码到散列,但(理论上)从散列回到密码是非常困难的。
刚才“理论上”这个词已经被抛出了很多,这就是原因。

哈希破解:
散列破解需要获取一个大的词表或字典并对每个单词进行散列。然后,您将字典中每个单词的哈希值与您尝试破解的哈希值进行比较。一旦你找到了一个匹配,你就找到了你的话!这就是为什么不建议使用常用词作为密码的原因。
参考上面的例子,黑客获得了访问网站登录数据库的权限,这是数据库中的一行 -

Username

Password Hash

pharrell1575f4dcc3b5aa765d61d8327deb882cf99

因为黑客不会仅仅因为密码被散列而放弃,他们将通过像这样的散列破解器(它检查非常常用的散列)来运行这个散列。只需输入哈希“5f4dcc3b5aa765d61d8327deb882cf99”,即可解决 reCaptcha,并得到结果——

crackstation.net 破解一个常见的 MD5 哈希

现在,黑客知道 pharrell157 的密码只是在几秒钟内使用免费在线工具的“密码”。
这是 MD5 哈希不安全的主要原因之一。因为它是一个未加盐的哈希(与 BCrypt 不同),所以每次都从相同的数据产生相同的哈希。也就是说,“密码”的 MD5 哈希值将始终为“5f4dcc3b5aa765d61d8327deb882cf99。
除了哈希破解(这是每个哈希都容易受到攻击的东西)之外,MD5 还有一个更大的原因是非常不安全的。

哈希冲突:
世界上任意数量的比特有无数种可能的组合。因此,有无数种可能的数据可以被散列。请注意上面的散列定义,其中指出散列始终是固定长度的。例如,MD5 哈希总是 128 位长(通常表示为 16 个十六进制字节)。因此,有 2^128 个可能的 MD5 哈希值。虽然这是一个非常大的数字,但它肯定是有限的……尽管可以散列的可能密码的数量是无限的。这意味着无限多个不同的密码具有相同的哈希值。这也意味着,如果黑客获得了密码的 MD5 散列的访问权限,他们不一定需要找到实际密码,而是需要找到共享该散列的其他东西。由于最近的技术创新,在 MD5 哈希中发现冲突几乎是微不足道的。有关更多信息,请参阅 Marc Stevens 的项目 HashClash 或 Corkami 的关于碰撞的 GitHub 存储库。

我们可以用什么来代替 MD5?
值得庆幸的是,既然 MD5 没有提供我们可能希望的相同级别的安全性,那么已经创建了许多可以提供的新哈希。例如,SHA-256(又名 SHA-2)更安全,因为它的长度是 256 位而不是 128 位。现在,大多数网站都使用像 BCrypt 这样的加盐哈希,只要有不同的盐(或种子)。在某些情况下,MD5 哈希值可能仍用于数字取证,但这些更安全的替代方案大多已成功。