MD5 在线加密、SHA256 在线计算、文件哈希校验,说的其实是同一件事:给一段文字或一个文件算出一串固定长度的「指纹」。同一份内容算出的哈希值永远一样,内容改一个字符,哈希值就完全不同,所以它常被用来核对文件有没有损坏、有没有被人动过手脚。
需要先说清楚:哈希是单向的,算出去就回不来。网上所谓「MD5 解密」并不是真的把哈希还原,而是拿现成的字典去比对,只对简单口令有效。下面把算法、长度和常见用途一并讲清。
哈希不是加密:为什么算出去的哈希收不回来
加密是一把锁配一把钥匙,用钥匙锁上、再用钥匙打开;哈希则像把一本书压成一张指纹卡——过程不可逆,拿到指纹也拼不回原书。哈希函数把任意长度的输入压成固定长度的输出,而且是多对一的:不同内容理论上可能得到同一个哈希,但要故意造出两份不同内容、哈希却相同的数据,难度极高(这就是抗碰撞)。正因为收不回来、又对改动敏感,哈希才适合做校验,而不是做保密。
延伸阅读:哈希算法对照表
五种常见算法的输出长度,一眼记牢
哈希值通常用十六进制表示,位数由算法决定:MD5 是 128 位,写成 32 位十六进制;SHA-1 是 160 位,40 位;SHA-256 是 256 位,64 位;SHA-384 是 384 位,96 位;SHA-512 是 512 位,128 位。记住这个对应关系,看到一串哈希就能大致判断它用了哪种算法——32 位多半是 MD5,40 位是 SHA-1,64 位是 SHA-256。位数越长,理论上越难被暴力破解或碰撞。
MD5 和 SHA-1 为什么不能再用于安全场景
MD5 和 SHA-1 都已被证实存在碰撞:可以人为构造出两份内容不同、哈希值却相同的数据。这意味着攻击者有可能在不改变哈希的前提下替换掉原始内容,所以它们不再适合用在数字签名、证书、口令存储这类安全场景,这类场景应改用 SHA-256 及以上。MD5 和 SHA-1 并非一无是处,用在校验文件完整性、判断内容是否重复、生成缓存键这些不涉及对抗的场景里仍然够用,但要有意识地把它们和安全场景分开。
「MD5 解密网站」到底在做什么
哈希不可逆,那「MD5 解密」是怎么做到的?答案是查表。有人把常见口令(比如 123456、password)预先算好哈希,存成巨大的对照表,也就是彩虹表;你在解密网站输入一串 MD5,它其实是在表里反查有没有对应的明文,查到就显示,查不到就无解。所以它只能还原那些简单、常见的口令,一个足够复杂的口令根本查不到。这也从侧面说明:口令存储不能只做一次哈希,而要加盐并多次迭代,让查表失去意义。
下载文件后,怎么用哈希核对有没有损坏或被改
很多软件、系统镜像在下载页会附一个 SHA-256 值。你下载完文件后,用工具算出它的哈希,和官方公布的值逐位对照:完全一致说明文件完整、没被动过;不一致则可能是下载中断损坏,也可能被人替换过,务必不要运行。实际操作中,长哈希值肉眼比对容易看花,建议直接复制两段文本做比较。我们帮朋友排查过一次:他装的工具安装包哈希对不上,重新下载后才发现第一次的包在网络传输中损坏了,装上去一直报错,换了完整包就正常了。
该选哪种算法:校验、去重、签名分开看
按用途挑就不会错:校验文件是否损坏、判断两段内容是否相同、给缓存生成键,MD5 或 SHA-256 都可以,追求速度用 MD5、追求更稳妥用 SHA-256;涉及数字签名、证书、口令存储,必须用 SHA-256 及以上,绝不能用 MD5 或 SHA-1。至于 CRC32 这类算法,它算的是校验和,只用来发现传输错误,不属于密码学哈希,不能用来防篡改。
参考资料
常见问题
MD5 能解密还原吗?
不能。哈希是单向的,无法从哈希值反推出原文。MD5 解密网站实际是查彩虹表比对,只对常见简单口令有效,复杂口令查不到。
MD5 和 SHA-256 有什么区别?
主要是输出长度和安全性:MD5 输出 128 位(32 位十六进制),SHA-256 输出 256 位(64 位十六进制)。MD5 已被证实存在碰撞,不宜用于安全场景;SHA-256 目前仍安全。