跳转至

密码学哈希

哈希函数

一个哈希函数(hash function)是一个函数,它接收任何长度的数据并输出一个固定长度的数据,称为其哈希(hash)。

哈希函数是确定性的。相同的输入数据将总是产生相同的哈希值。哈希函数对于单个输入能快速计算。

数据(十六进制) 文本 (UTF-8) SHA-2 256 哈希
(空数据) (空数据) e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
48656c6c6f20776f726c64 Hello world 64ec88ca00b268e5ba1a35678a1b5316d212f4f366b2477232534a8aeca37f3c

密码学哈希函数

一个密码学哈希函数也是:

  • 不可逆的。哈希函数只能接收一段数据并输出其哈希值。即使说它们是可逆的,这一操作也是很不可行的:逆转哈希函数的唯一方法是尝试输入。同样,要找到两个具有相同哈希值的不同数据也是不可行的。
  • 混乱的。从数据到哈希值的映射应该看起来是随机的。两块相似的数据会产生看似不相关的哈希值。
数据(十六进制) SHA-2 256 哈希
089f8954a605c945 e7ad94f8f1338ce71c0b033d881abafd978cb332a56f1fe2d79082565aafc5ee
089f8954a605c946 581c858eba8d0c8a9e418f35193ca72536f91f55a7610b7001d0c0330bc8b1b6

当我们需要确保两块数据是相同的,而不需要比较其中任何有意义的细节时,哈希就很有用。当涉及到数据验证时,系统经常比较哈希值,而不是数据本身。

目前,最常用的安全加密哈希函数是 SHA-2 和 SHA-3 系列。

不安全因素

当我们使用密码学哈希来保护东西时,我们依靠的是它们的不可逆转性。因为理想的加密哈希函数是不可逆的,所以最低效的攻击方式是使用暴力,简单地一个一个尝试输入。找到相同哈希值的几率非常低,通常需要非常长的时间才能找到相同的哈希值。

算法中的一个聪明的发现可能使攻击比暴力更快。当这种攻击被发现时,这种哈希函数应该被淘汰。