安全

哈希函数通俗讲解:MD5、SHA-1、SHA-256 的区别与正确用法

下载校验和、Git 提交 ID、区块链地址都是哈希值。本文讲解哈希与加密的区别,以及不同任务该选哪种算法。

什么是哈希函数

哈希函数接收任意长度的输入,输出一个固定长度的短值,称为哈希值或摘要。无论你哈希的是一个单词还是几 GB 的视频,SHA-256 的输出始终是 256 位,即 64 个十六进制字符。

关键在于哈希是单向的,无法从哈希值反推出原始输入。这正是它与加密(有密钥即可还原)以及 Base64(任何人都能还原)的根本区别。

好哈希的三个特性

用于安全场景的密码学哈希函数必须满足以下条件。

  • 确定性:相同的输入总是得到相同的哈希。
  • 雪崩效应:只改动一个字符,输出就完全不同,如下例中 hello 与 hello! 的对比。
  • 抗碰撞性:在实际中几乎不可能找到哈希相同的两个不同输入。
SHA-256("hello")  = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
SHA-256("hello!") = ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b
MD5("hello")      = 5d41402abc4b2a76b9719d911017c592

大小写同样有影响:Hello 和 hello 的哈希毫无关联。比较哈希前,请先确认输入完全一致,包括空格、换行和大小写。

MD5、SHA-1 与 SHA-256 对比

MD5 输出 128 位(32 个十六进制字符)的摘要。它速度很快,但自 2004 年起就已出现实用的碰撞攻击,因此绝不能用于安全目的。用作检测意外损坏的简单校验和仍然可以。

SHA-1 输出 160 位。2017 年,Google 与 CWI 的研究人员公布了两个 SHA-1 哈希相同的不同 PDF 文件(SHAttered),宣告了它在安全领域的终结。浏览器和证书颁发机构已不再信任 SHA-1 证书。

SHA-256 属于 SHA-2 家族,输出 256 位,是软件校验和、TLS 证书和区块链的事实标准。新系统默认应选择 SHA-256 或更强的算法。

用校验和验证文件

下载页面常在文件旁列出 SHA-256 值。计算你下载的文件的哈希并进行比较:只要传输过程中有一个比特发生变化或被篡改,哈希就会完全不同。

如果校验和与文件放在同一台服务器上,攻击者可以同时替换两者。因此重要软件会用 GPG 对校验和文件签名,或通过独立的 HTTPS 渠道发布。

为什么不能直接用 SHA-256 存密码

既然哈希是单向的,用 SHA-256 存储密码听起来很安全,其实不然。SHA-256 的设计目标就是快,一块 GPU 每秒能计算数十亿次哈希。窃取了哈希列表的攻击者可以以极高速度尝试常见密码。

请使用专门设计、刻意放慢速度的函数,如 bcrypt、scrypt 或 Argon2。它们会给每个密码混入唯一的随机盐值,使相同密码存储的值也不同,从而让预先计算的彩虹表失效。

该用哈希、HMAC 还是加密?

使用 AIBIZAP 哈希生成器,把同一句话交给多种算法处理,看看只改一个字符时结果变化有多大。如果需要隐藏数据并在之后还原,请试试 AES 加密测试工具。

  • 检查数据是否被改动:SHA-256 哈希。
  • 确认消息来自持有共享密钥的一方:HMAC-SHA256(Webhook 与 API 请求签名)。
  • 存储密码:bcrypt、scrypt 或 Argon2。
  • 隐藏数据并在之后读回:AES-GCM 等加密算法。

用这些工具试一试

更多指南

全部指南