1. 什么是哈希函数
哈希函数(Hash Function)是一种将任意大小的数据转换为固定长度值的单向函数。它具有雪崩效应,即输入哪怕只有微小变化,输出的哈希值也会完全不同;而相同的输入始终会产生相同的输出。MD5生成128位哈希,SHA-1生成160位哈希,SHA-256生成256位哈希。由于哈希是无法逆向解密的单向函数,因此非常适合在隐藏原始数据的同时验证数据完整性。它被广泛应用于文件下载校验、密码存储、区块链和数字签名等领域。
将文本转换为各种哈希算法。可用于文件完整性验证、密码哈希处理和数据校验。
哈希函数(Hash Function)是一种将任意大小的数据转换为固定长度值的单向函数。它具有雪崩效应,即输入哪怕只有微小变化,输出的哈希值也会完全不同;而相同的输入始终会产生相同的输出。MD5生成128位哈希,SHA-1生成160位哈希,SHA-256生成256位哈希。由于哈希是无法逆向解密的单向函数,因此非常适合在隐藏原始数据的同时验证数据完整性。它被广泛应用于文件下载校验、密码存储、区块链和数字签名等领域。
MD5是1991年推出的128位哈希算法,速度极快,但容易受到碰撞攻击。2004年发现了严重的安全漏洞后,MD5已不再适用于密码学用途,目前仅用于文件校验等场景。SHA-1生成160位哈希,虽然比MD5更安全,但2017年谷歌公布了真实的碰撞案例后,该算法也被逐步淘汰。SHA-256属于SHA-2系列,生成256位哈希,是目前应用最广泛的标准算法,比特币也采用SHA-256。SHA-512生成512位哈希,安全性更高,但计算速度较慢。新系统应优先采用SHA-256及以上的算法。
哈希函数的安全性主要有三项核心要求。第一,原像抗性(Preimage Resistance):难以从哈希值反推出原始数据。第二,第二原像抗性(Second Preimage Resistance):难以找到另一个能产生相同哈希值的输入。第三,抗碰撞性(Collision Resistance):难以找到两个不同的输入产生相同的哈希值。MD5和SHA-1的抗碰撞性已被攻破,攻击者可以人为构造出具有相同哈希值的不同数据。彩虹表(Rainbow Table)攻击是利用预先计算好的哈希表进行反查的方法,添加盐值(Salt)可以有效防御这种攻击。
文件哈希是验证下载文件是否被篡改的最有效方法之一。软件发布网站通常会随文件一同提供官方哈希值。用户下载文件后自行计算哈希值,并与官方公布的值进行比对。哪怕只有一个比特发生变化,得到的哈希值也会完全不同,因此可以立即察觉篡改行为。这一方法在Linux镜像文件、开源软件、区块链交易等场景中都是必不可少的。Git也会为每一次提交生成SHA-1哈希,以确保代码的完整性。在大文件传输过程中,因网络故障导致的数据损坏同样可以通过哈希值检测出来。
将密码存入数据库时,绝对不能以明文形式保存,而应转换为哈希值存储。但单纯使用MD5或SHA-256并不足够安全,因为它们容易受到彩虹表攻击。必须额外添加盐值(Salt)——即为每个密码附加的随机字符串,使相同的密码也能生成不同的哈希值。此外,还应使用bcrypt、scrypt、Argon2等计算速度较慢的哈希函数,它们会刻意降低计算速度,从而增加暴力破解的难度。OWASP将Argon2列为密码哈希的首选推荐算法。
彩虹表(Rainbow Table)是一个存储了大量预先计算好的哈希值的庞大数据库。攻击者会预先计算数百万个常见密码的哈希值,一旦获取到被盗的哈希数据,便可通过匹配来还原出原始密码。例如,"password123"的MD5值始终固定为"482c811da5d5b4bc6d497ffa98491e38",因此可以在表中迅速查到。加盐(Salt)正是应对这一问题的有效方法:为每个用户添加独一无二的随机字符串后,即便密码相同,生成的哈希值也会不同。将"password123"与"x8k2m9"拼接后再哈希,得到的结果就不会出现在彩虹表中。盐值本身可以以明文形式存储在数据库中,但每个密码都应使用不同的盐值才能真正发挥效果。