什么是文件哈希
哈希(Hash)是把任意长度数据变成固定长度字符串的算法。文件哈希是文件的"指纹"——同一文件哈希值唯一,文件改一个字节哈希值就变。
常见用途:
- 验证文件完整性(下载是否完整)
- 防篡改(文件是否被修改)
- 去重(两个文件是否相同)
- 密码存储(存哈希不存明文)
常见哈希算法
MD5
- 输出 128 位(32 位十六进制字符串)
- 速度快
- 已被破解,存在碰撞(不同文件相同哈希)
- 不适合安全场景
- 仍用于完整性校验(非安全场景)
SHA-1
- 输出 160 位(40 位十六进制字符串)
- 速度中等
- 已被破解,存在碰撞
- 不推荐用于安全场景
- Git 早期用 SHA-1,现迁移到 SHA-256
SHA-256
- 输出 256 位(64 位十六进制字符串)
- 速度较慢
- 安全,目前无碰撞
- 推荐用于安全场景
- 区块链、HTTPS 证书都用 SHA-256
SHA-512
- 输出 512 位(128 位十六进制字符串)
- 速度慢
- 安全性比 SHA-256 更高
- 适合高安全场景
选择建议
- 完整性校验(非安全):MD5 够用(快)
- 安全场景:SHA-256(平衡安全和速度)
- 高安全场景:SHA-512
- 不推荐:SHA-1(已破解)
哈希校验的原理
生成哈希
- 读取文件全部内容
- 用哈希算法计算
- 输出固定长度字符串
校验过程
- 下载文件时获取官方哈希值
- 本地计算文件哈希值
- 对比两个哈希值
- 相同 = 文件完整,不同 = 文件损坏或被篡改
为什么能校验完整性
哈希算法的特性:
- 同一输入永远得到同一输出
- 不同输入几乎不可能得到同一输出(碰撞概率极低)
- 输入改一个字节,输出完全不同(雪崩效应)
所以文件哪怕改一个字节,哈希值也完全不同。
使用场景
下载校验
下载大文件(系统镜像、软件安装包)时,官方提供哈希值。下载后本地算哈希对比,确认下载完整没损坏。
防篡改
重要文件(合同、证据)生成哈希存档。日后验证文件是否被修改。
文件去重
两个文件哈希相同,内容就相同(碰撞概率极低)。用哈希判断文件是否重复,比逐字节对比快。
密码存储
网站存用户密码的哈希值,不存明文。登录时算输入密码的哈希对比。即使数据库泄露,攻击者也拿不到明文密码。
数字签名
数字证书用哈希 + 加密验证文件来源和完整性。
如何校验文件哈希
用 DocsAll 校验
- 上传文件
- 工具计算 MD5、SHA-1、SHA-256
- 显示哈希值
- 和官方哈希对比
浏览器端计算,文件不上传。
Windows 命令行
certutil -hashfile 文件名 SHA256
Mac/Linux 命令行
shasum -a 256 文件名
md5 文件名
对比哈希
- 复制官方哈希值
- 粘贴到对比框
- 工具自动对比
- 或手动逐字符对比
常见问题
哈希值不一样怎么办
- 下载不完整:重新下载
- 文件被篡改:从可信来源重新下载
- 哈希算法不同:确认用同一种算法对比
MD5 还能用吗
- 完整性校验(非安全场景):能用
- 安全场景(防篡改、密码):不推荐,用 SHA-256
- 碰撞风险:有人能构造两个不同文件有相同 MD5
哈希能反推原文吗
不能。哈希是单向函数。从哈希值无法还原原文。所以存密码哈希安全(即使泄露也拿不到明文)。
大文件哈希慢
- 哈希要读取整个文件
- 大文件(几 GB)计算需要时间
- 正常现象,耐心等待
哈希值大小写
哈希值是十六进制字符串,大小写不影响(a 和 A 等价)。对比时忽略大小写。
安全提示
用可信来源的哈希值
从官方网站、可信渠道获取哈希值。别用来源不明的哈希值校验,可能被攻击者替换。
用强哈希算法
安全场景用 SHA-256 或更高。MD5 和 SHA-1 已不安全。
哈希不等于加密
哈希是单向的,不能解密。加密是双向的,能解密。别把哈希当加密用。
加盐哈希
存密码时用加盐哈希(salt + password 再哈希),防止彩虹表攻击。
用 DocsAll 计算哈希
- 上传文件
- 自动计算 MD5、SHA-1、SHA-256、SHA-512
- 显示所有哈希值
- 复制需要的哈希值
- 和官方对比
浏览器端计算,文件不上传服务器。
小结
文件哈希是文件指纹,用于完整性校验和防篡改。MD5 快但已破解,SHA-256 安全推荐。校验时从可信来源获取哈希值,用同种算法对比。DocsAll 文件哈希工具 浏览器端运行,文件不外传。