首页/我的作品/密码学/7.3 你每天都在用:密码存储、文件校验
密码学:守护数字世界的秘密

7.3 你每天都在用:密码存储、文件校验

第 41 / 78 篇 · Crazy Boy

哈希函数听起来像是深奥的数学概念,但实际上,你每天上网、下载文件、甚至用微信聊天,都离不开它。它就像数字世界的隐形守护者,默默保护着你的数据安全。下面我们就来看看哈希函数最常见的几个应用场景。

密码存储:网站真的知道你的密码吗?

每次你登录一个网站,输入用户名和密码,点击登录,背后发生了什么?

你可能会以为,网站会把你输入的密码和数据库里存的密码比对一下。但问题是,如果网站直接存储你的密码原文,一旦数据库泄露,所有用户的密码就全暴露了。这种事情历史上发生过无数次,每次都会导致成千上万的用户陷入风险。

那么,网站是怎么做的呢?答案是:它们只存储你密码的哈希值。

当你注册账号时,网站会计算你密码的哈希值,然后把这个哈希值存进数据库。当你登录时,网站会计算你输入密码的哈希值,然后和数据库里的哈希值比对。如果相同,就说明密码正确。

这样一来,即使数据库被黑客拖库,他们拿到的也只是一堆哈希值,而不是你的明文密码。由于哈希函数的不可逆性,从哈希值无法还原出原始密码,黑客只能干瞪眼。

但这还不够安全。因为很多用户喜欢用简单密码,比如“123456”、“password”。黑客可以预先计算出这些常见密码的哈希值,形成一个巨大的彩虹表。拿到数据库后,直接把哈希值和彩虹表对照,就能快速匹配出密码。

为了对抗彩虹表,网站会使用加盐技术。所谓“盐”,就是一段随机生成的字符串,在计算哈希之前,先把密码和盐拼接在一起。每个用户的盐都不同,即使两个用户密码相同,加盐后的哈希值也不同。黑客要破解加盐哈希,就需要为每个盐单独生成彩虹表,计算量巨大,几乎不可行。

所以,当你听到某网站被拖库的消息,如果这个网站使用了加盐哈希,你的密码风险就小得多。当然,最好的习惯还是每个网站用不同的强密码,配合密码管理器。

文件校验:下载的文件真的是原版吗?

你有没有在下载软件时,看到网站旁边附了一串长长的数字,比如:

SHA256: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824

这串数字就是文件的哈希值,用于验证你下载的文件是否完整、是否被篡改过。

为什么需要这个?因为下载过程中可能发生网络错误,导致文件损坏;更严重的是,如果下载服务器被攻击,文件可能被替换成恶意版本。通过对比哈希值,你可以确保你拿到的文件和官方发布的是同一个。

具体做法是:下载完成后,用本地工具(比如sha256sum命令)计算文件的哈希值,然后和官网公布的哈希值比对。如果一致,说明文件完好无损;如果不一致,说明文件有问题,需要重新下载。

Linux发行版、开源软件、甚至一些游戏安装包都会提供哈希校验功能。这是保护用户免受恶意篡改的重要防线。

Git版本控制:代码历史的防篡改

如果你是程序员,可能每天都在用Git。Git是一个版本控制系统,用来管理代码的修改历史。你有没有想过,Git是怎么保证代码历史不可篡改的?

答案还是哈希。Git会给每一次提交(commit)计算一个SHA-1哈希值(现在也在向SHA-256过渡),这个哈希值不仅包括代码的内容,还包括提交时间、作者信息、以及父提交的哈希值。这样一来,每个提交的哈希都依赖于之前的所有历史。如果你试图修改历史上的某个文件,它的哈希就会变,进而导致后续所有提交的哈希都变,任何人都能发现历史被篡改了。

这就是Git被称为“不可篡改”的由来。虽然SHA-1已经被证明不安全,但Git社区正在迁移到更安全的哈希算法,以保证代码历史的完整性。

区块链:比特币的信任基石

说到哈希,不能不提区块链。比特币的核心数据结构——区块链——就是由一个个区块链接而成的链条。每个区块包含一批交易,以及上一个区块的哈希值。只要你修改了任何一个区块里的交易,这个区块的哈希就会变,下一个区块里的“父哈希”就不匹配,整个链条就断了。除非你重新计算后面所有区块的哈希,这需要巨大的计算量(工作量证明)。

正是这种哈希链的设计,让区块链变得不可篡改。比特币的“挖矿”本质上就是寻找一个随机数,使得整个区块的哈希小于某个目标值,这个过程耗费大量算力,但也让篡改历史的成本高得无法承受。

其他日常应用

  • 数字签名:先对文件计算哈希,再对哈希签名,可以大大缩短签名长度,提高效率。
  • 消息认证码(HMAC):结合哈希和密钥,用于验证消息的完整性和真实性,常见于API认证。
  • 重复数据删除:存储系统可以通过哈希快速判断文件是否已经存在,节省空间。
  • P2P下载:BT下载把文件分成小块,每块有哈希值,下载完成后可以校验每个块的完整性。

小结

哈希函数就像数字世界的忠诚卫士,不声不响地保护着你的密码、你下载的文件、你写的代码、甚至你参与的每一笔加密货币交易。它虽然看不见摸不着,但它的存在,让互联网从一个充满欺诈的地方,变成了我们可以信任的数字空间。

下一节,我们将用一张表格,帮你彻底分清哈希和加密这两个容易混淆的概念。