哈希 ≠ 加密
这是信息安全领域最常见的误解。哈希(Hash)是单向函数——输入任意数据,输出固定长度的摘要,无法从摘要反推原始数据。加密(Encryption)是双向函数——通过密钥可以加密,也可以解密。哈希用于验证数据完整性,加密用于保护数据机密性。混淆两者会导致严重的安全设计缺陷。
哈希函数的核心特性
- 确定性:相同的输入永远产生相同的输出
- 雪崩效应:输入的微小变化导致输出的巨大变化
- 不可逆性:从哈希值无法推导出原始数据
- 抗碰撞性:找到两个不同输入产生相同输出极其困难
- 固定长度:无论输入多大,输出长度固定
MD5:曾经的王者
MD5由Ron Rivest于1992年设计,输出128位(32个十六进制字符)摘要。MD5曾被广泛用于文件校验和密码存储,但2004年王小云教授团队发现了MD5的碰撞攻击方法,可以在数小时内找到两个不同文件产生相同的MD5值。因此,MD5不应再用于安全场景(密码存储、数字签名),但仍可用于非安全场景(文件校验、缓存键)。
SHA家族
SHA(Secure Hash Algorithm)由NSA设计,NIST发布。SHA-1输出160位摘要,2005年被发现碰撞漏洞,2017年Google完成首次实际碰撞攻击。SHA-256是SHA-2家族中最流行的成员,输出256位摘要,目前没有已知的有效碰撞攻击,是比特币、TLS证书、数字签名的标准选择。SHA-512提供更强的安全边际,适用于对安全性有更高要求的场景。
密码存储的正确方式
永远不要直接存储密码的哈希值。使用bcrypt、scrypt或Argon2等专用密码哈希算法,它们自带盐值且计算成本可调(work factor)。如果必须使用SHA-256,至少要加盐(每个用户一个唯一随机盐值)并迭代(PBKDF2,至少10万次迭代)。
文件完整性校验
下载大文件后,对比官方提供的哈希值与本地计算的结果,可以验证文件是否被篡改。SHA-256是当前推荐的校验算法。在Linux上使用sha256sum命令,在macOS上使用shasum -a 256命令。
工具推荐
使用我们的在线Hash生成器,支持MD5、SHA-1、SHA-256、SHA-512等多种算法,支持文本和文件哈希计算,一键复制结果。