SHA-256 是什么?文件校验与密码存储原理
下载完一个安装包,官网常会让你「校验 SHA-256」;用户密码存进数据库前也要「哈希」一下。哈希(Hash)在这些场景里反复出现,却常被和「加密」搞混。本文讲清 SHA-256 的工作原理、哈希的核心特性,以及为什么密码不能直接 hash。
哈希的三大特性
哈希函数把任意长度的输入,计算成一段固定长度的摘要(比如 SHA-256 永远输出 64 位十六进制字符串)。它有三个关键特性:
- 确定性:相同的输入,永远得到相同的输出。
- 单向性:无法从摘要反推出原文。
- 抗碰撞:几乎不可能找到两个不同的输入产生相同摘要。
注意「固定长度」——无论输入是 1 个字节还是 10GB,SHA-256 的输出都是 64 个字符。这也是它能当「指纹」用的原因。
SHA-2 族与 MD5 的退役
SHA-256 属于 SHA-2 族(还有 SHA-512 等),是目前推荐的安全哈希算法。而 MD5、SHA-1 已经被证明存在安全缺陷(能人为制造碰撞),不再适合安全场景——浏览器 Web Crypto API 因此干脆不支持 MD5。
用途一:文件完整性校验
下载大文件后,对比官方公布的 SHA-256:
- 在本地计算下载文件的 SHA-256。
- 和官网公布的摘要逐字符比对。
- 完全一致,说明文件未损坏、未被篡改。
这在系统镜像、安装包分发中非常常见,能防止下载被劫持或传输损坏。
用途二:密码存储(不能直接 hash)
很多人以为密码存储就是「把密码 hash 一下存数据库」,这只对了一半。直接 hash 密码是危险的——攻击者可以用「彩虹表」(预计算的密码-哈希对照表)反查出弱密码。
正确做法是:
- 加盐(salt):每个密码配一个随机盐,一起哈希,让彩虹表失效。
- 用慢哈希算法:如 bcrypt、scrypt、argon2,故意让计算变慢,大幅提高暴力破解成本。
哈希不是加密
最后澄清一个根本误解:哈希没有「解密」这回事。
- 加密是双向的(能加密就能解密)。
- 哈希是单向的(算出摘要就回不去了)。
网上所谓「MD5 在线破解」,本质是对常见弱密码的彩虹表反查,并不能还原任意内容。
实操
想计算文件或文本的 SHA-256/SHA-512、验证文件完整性,可以用 UPTools Hash 生成工具,基于浏览器 Web Crypto API 本地计算,数据不上传。
总结
SHA-256 适合做完整性校验和数据指纹;存储密码要用盐 + 慢哈希(bcrypt/scrypt/argon2);哈希是单向的,不存在解密。理解了这些,就不会再把哈希误当加密用了。
相关文章
- 用 Math.random 生成密码为什么不安全?CSPRNG 与密码熵 用 Math.random 生成密码或 Token 是常见错误,它可被预测。本文讲清为什么必须用 crypto.getRandomValues,以及密码强度由字符集和长度共同决定。
- 为什么在线工具比本地软件更注重隐私?本地处理如何保护你的数据 同样是处理敏感文件,为什么说浏览器本地完成的在线工具反而比某些本地软件更注重隐私?本文讲清本地处理的原理、它保护了什么、以及它的边界。
- SVG 直接内联 HTML 会触发 XSS?压缩与安全检测一次讲清 SVG 不只是图片,它是 XML,能内嵌 script 和事件属性。用 img 引入不会执行脚本,直接内联进 HTML 就可能触发 XSS。本文讲清风险边界和压缩要点。