密码学基础课
现代密码学的基石——哈希函数的“雪崩效应”
哈希函数(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 还不够:
- 加盐(salt):给每个用户配一段随机字符串,跟密码拼在一起再哈希。这样两个人都用
password123,存下的哈希也不一样,攻击者的“彩虹表”(预先算好的哈希大全)就作废了。 - 慢哈希:SHA-256 太快了,显卡一秒能猜几十亿次。专门存密码要用故意设计得又慢又吃内存的算法,比如 bcrypt、scrypt、Argon2,让每猜一次都付出代价。
但再好的哈希也救不了白密码:password123 在泄露字典里排得很靠前,攻击者第一批就会去试它。所以,请用灰密码。
动手试试:亲眼看雪崩
提示:试着只改一个字母、加一个空格,看看有多少位翻转。计算全部在你的浏览器里用 Web Crypto 完成,不会上传。
课堂小结:哈希是单向的数据指纹;输入改一点,输出变一半(雪崩效应)。网站只存加盐的慢哈希,不存明文密码。
思考题:如果哈希没有雪崩效应,改一个字母只改一两个字符,攻击者能利用这一点做什么?
思考题:如果哈希没有雪崩效应,改一个字母只改一两个字符,攻击者能利用这一点做什么?