首页/我的作品/密码学/7.1 哈希函数是什么:一种“不可逆”的摘要
密码学:守护数字世界的秘密

7.1 哈希函数是什么:一种“不可逆”的摘要

第 39 / 78 篇 · Crazy Boy

假设你有一个文件,你想确认它有没有被篡改过。你可以把它压缩成一个短小的“指纹”,只要文件内容有任何变化,这个指纹就会完全不同。别人拿到这个指纹,可以验证文件的完整性,但无法从指纹还原出文件本身。这就是哈希函数的基本思想。

哈希函数(Hash Function)是一种数学函数,它接受任意长度的输入数据,通过一系列复杂的计算,输出一个固定长度的、看似随机的字符串,这个输出被称为哈希值(hash value)或摘要(digest)。

哈希函数的四个核心特性

1. 单向性(不可逆)

这是哈希函数最重要的特性。给定一个哈希值,在计算上不可能还原出原始的输入数据。就像你无法从一个人的指纹反推出他的完整长相一样。这种单向性使得哈希函数非常适合用于验证——你可以把哈希值公开,而不必担心泄露原始数据。

2. 确定性

相同的输入永远产生相同的哈希值。如果你对同一段文字计算两次哈希,得到的结果完全一样。这是哈希函数能够用于验证的基础。

3. 雪崩效应

输入的微小改变会导致输出的巨大变化。哪怕只修改一个字母,甚至一个标点,计算出的哈希值也会变得面目全非,看起来就像完全随机的新值。例如:

  • 输入 “hello” 的SHA-256哈希:
    2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
  • 输入 “Hello”(首字母大写)的SHA-256哈希:
    185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969

你看,仅仅改变一个字母的大小写,哈希值就完全不一样了。这个特性让攻击者无法通过微调输入来猜测哈希值。

4. 抗碰撞性

理论上,由于哈希函数的输出长度固定,而输入可以是任意长度,必然存在两个不同的输入产生相同哈希值的情况——这叫做碰撞。但好的哈希函数应该让找到这样的碰撞在计算上不可行。也就是说,无法在合理的时间内人为构造出两个不同输入,使得它们的哈希值相同。

把哈希看作数据的DNA

我们可以用DNA来比喻哈希函数。每个人的DNA都是独一无二的,可以从一个人身上提取,但无法从DNA反推出这个人的全部特征。同样,哈希值可以作为数据的唯一标识,任何修改都会导致DNA改变,从而被发现。

另一个常见的比喻是摘要:哈希值就像一本书的内容摘要,从摘要中无法还原整本书的内容,但可以用摘要来快速判断两本书是否相同。

哈希不是加密

这是初学者最容易混淆的地方。哈希和加密虽然都是密码学工具,但目的完全不同:

  • 加密的目的是隐藏数据,它是可逆的——只要有正确的密钥,就可以还原出原文。
  • 哈希的目的是验证完整性,它是不可逆的——不需要还原原文,只需要验证数据是否被篡改。

打个比方:加密是把信放进保险箱,有钥匙的人才能打开;哈希是给信封上盖一个火漆印章,任何人都可以看到印章是否完好,但无法从印章恢复信的内容。

哈希函数用在哪儿?

哈希函数无处不在,只是你可能没意识到:

  • 当你登录网站时,系统会把你输入的密码哈希后与数据库中的哈希值比对,而不是直接比对密码原文。
  • 当你下载一个大文件时,网站通常会提供一个哈希值,让你用工具计算下载文件的哈希值,以确保文件没有损坏或被篡改。
  • Git用哈希值标识每一次提交,确保代码历史不可篡改。
  • 区块链用哈希把区块链接成一条链,保证交易记录永久可信。

在接下来的几节,我们将深入探索哈希函数的世界,看看MD5是如何从风光无限到被彻底抛弃的,SHA家族又是如何接力的,以及哈希函数在现实中的种种应用。