密码学基础课

现代密码学的基石——哈希函数的“雪崩效应”

哈希函数(hash function,也叫散列函数)像一台“数据绞肉机”:随便丢进去什么——一个字、一部小说、一整个硬盘——出来的都是固定长度的一串“指纹”。SHA-256 输出的永远是 256 位,也就是 64 个十六进制字符。它有两个让密码学家离不开它的性格。

性格一:单向——绞成肉馅,变不回猪

从输入算哈希,一眨眼;从哈希倒推输入,没有捷径,只能一个个去猜。这就是单向性(抗原像)。同时,想找到两个不同输入、却算出同一个哈希,也几乎不可能(抗碰撞)。

性格二:雪崩——改一个字母,面目全非

好的哈希函数,输入哪怕只动一位,输出也会有大约一半的位跟着翻转,看起来像换了一个完全无关的随机数。这叫雪崩效应:山顶滚下一颗小石子,山脚下是整片雪崩。

来看真实数据(已用 sha256sum 核对):

password123 →

ef92b778bafe771e89245b89ecbc08a44a4e166c06659911881f383d4473e94f

Password123 →

008c70392e3abfbd0fa47bbc2ed96aa99bd49e159727fcba0f2e6abeb3a9d601

两个输入只差一个字母的大小写——在 ASCII 里,p(0x70)和 P(0x50)只差1 个比特。可两个哈希的 256 位里有 117 位不同(约 45.7%),64 个字符里有 61 个对不上。哈希值之间“长得像不像”,完全不透露输入之间像不像。

这跟你的密码有什么关系?

靠谱的网站不保存你的密码原文,只保存它的哈希。你登录时,系统把你输入的密码再算一遍哈希,跟库里存的比一比:一样就放行。这样即使数据库被偷,小偷拿到的也只是一堆“指纹”,没法直接倒推出密码。

不过光用 SHA-256 还不够:

但再好的哈希也救不了白密码:password123 在泄露字典里排得很靠前,攻击者第一批就会去试它。所以,请用灰密码。

动手试试:亲眼看雪崩

提示:试着只改一个字母、加一个空格,看看有多少位翻转。计算全部在你的浏览器里用 Web Crypto 完成,不会上传。

课堂小结:哈希是单向的数据指纹;输入改一点,输出变一半(雪崩效应)。网站只存加盐的慢哈希,不存明文密码。
思考题:如果哈希没有雪崩效应,改一个字母只改一两个字符,攻击者能利用这一点做什么?