这张表把常见哈希算法放在一起横向对比,四列分别是:算法名称、输出长度、典型用途、安全现状。选算法、判断一串哈希值属于哪种算法、或者想确认某个老算法还能不能用,都可以先查这张表。表里只收公认、稳定的结论,把握不准的算法一律不收。
输出长度怎么换算成十六进制位数
哈希值通常用十六进制显示,位数由算法决定:输出的比特数除以 4,就是十六进制字符数。所以 128 位是 32 个字符,160 位是 40 个,256 位是 64 个,384 位是 96 个,512 位是 128 个。记住这条换算,看到一串哈希的长度,就能反推它大概用了哪种算法:32 位多半是 MD5,64 位多半是 SHA-256。
「SHA-2 家族:SHA-224、256、384、512 是什么关系」SHA-2 是一组算法的统称,名字里的数字就是输出比特数:SHA-256 输出 256 位,SHA-384 输出 384 位,SHA-512 输出 512 位,SHA-224 则是为了适配较短输出而设计的 224 位版本。它们算法结构相近,只是输出长度和内部参数不同。日常优先选 SHA-256,需要更高强度就用 SHA-384 或 SHA-512;位数越长越难被暴力破解,代价是计算和存储略多。
MD5 和 SHA-1 为什么被淘汰
MD5 和 SHA-1 都已被证实存在碰撞:能人为构造两份内容不同、哈希值却相同的数据。哈希的作用是给内容一个独一无二的指纹,一旦能造出碰撞,攻击者就可能在不改变哈希的前提下替换内容,签名、证书这类依赖它的机制就不安全了。所以这两种算法在安全场景里应被淘汰,改用 SHA-256 及以上;但在校验文件完整性、判断内容是否重复这类不涉及对抗的场合,它们仍然能用。
CRC32 为什么不算密码学哈希
CRC32 算出的是一段 32 位校验和,主要用来发现数据在传输、存储过程中有没有出错,比如压缩包、网络协议都用到它。它设计的目标是查错快、算得快,而不是抗攻击,所以很容易被刻意构造出相同的值。正因如此,它不属于密码学哈希,不能用来防篡改或做签名,只适合当作一种快速的完整性检查。
SHA-3 是什么,要不要现在就换
SHA-3 是 NIST 通过公开竞赛选出的新一代哈希标准,它和 SHA-2 的内部结构完全不同,因此被认为即使 SHA-2 将来出现问题,SHA-3 也能作为独立的备用方案。目前 SHA-2 仍然安全,日常用 SHA-256 就够了,没有必要急着全换成 SHA-3;但在需要算法多样性的系统里,采用 SHA-3 是合理的加固手段。
该选哪种:按用途对号入座
校验文件是否损坏、判断内容是否重复、给缓存生成键,MD5 或 SHA-256 都可以,追求速度用 MD5、追求稳妥用 SHA-256;数字签名、证书、口令存储,必须用 SHA-256 及以上,绝不能用 MD5 或 SHA-1;只是想发现传输错误,用 CRC32 这类校验和即可,不必动用密码学哈希。先想清楚用途,再挑算法,就不会选错。
常见哈希算法对照
| 算法 | 输出长度 | 典型用途 | 安全现状 |
|---|---|---|---|
| MD5 | 128 位(32 位十六进制) | 文件校验、内容去重、缓存键 | 已不安全:可人为构造碰撞,不可用于签名、证书、口令 |
| SHA-1 | 160 位(40 位十六进制) | 早期版本控制、旧版校验 | 已不安全:2017 年被实测碰撞,不可用于安全场景 |
| SHA-224 | 224 位(56 位十六进制) | 需要较短输出的签名场景 | 安全:SHA-2 家族,输出短于 SHA-256 |
| SHA-256 | 256 位(64 位十六进制) | 数字签名、证书、口令存储、文件校验 | 目前安全:尚无实用碰撞,推荐广泛使用 |
| SHA-384 | 384 位(96 位十六进制) | 更高强度的签名与完整性校验 | 安全:SHA-2 家族,强度高于 SHA-256 |
| SHA-512 | 512 位(128 位十六进制) | 高强度签名、完整性校验 | 安全:SHA-2 家族,输出最长 |
| SHA3-256 | 256 位(64 位十六进制) | 新一代签名与校验 | 安全:结构与 SHA-2 不同,可作备用选择 |
| SHA3-384 | 384 位(96 位十六进制) | 新一代高强度校验 | 安全:SHA-3 家族 |
| SHA3-512 | 512 位(128 位十六进制) | 高强度新一代校验 | 安全:SHA-3 家族,输出最长 |
| CRC32 | 32 位(8 位十六进制) | 传输错误检测、压缩包校验 | 非密码学哈希:只查错、不防篡改,不能用于安全场景 |
延伸阅读:MD5/SHA 哈希生成器
参考资料
常见问题
MD5 和 SHA-256 该用哪个?
看用途:只是校验文件完整性、去重、做缓存键,用 MD5 或 SHA-256 都行;涉及签名、证书、口令存储等安全场景,必须用 SHA-256 及以上,不能用 MD5。
哈希输出长度里的位数和十六进制字符数怎么对应?
比特数除以 4 就是十六进制字符数。128 位是 32 个字符、160 位是 40 个、256 位是 64 个、384 位是 96 个、512 位是 128 个。