1. 问题
从网上下载文件,如何确认文件没被篡改?官网通常会提供一串哈希值,这串字符是干什么用的?
2. 什么是哈希校验
哈希校验是通过哈希函数对数据生成固定长度的哈希值,用于验证数据完整性。
特点:
- 固定长度:无论文件多大,哈希值长度固定
- 唯一性:不同文件的哈希值几乎不可能相同
- 不可逆:无法从哈希值反推原文件
文件内容 → 哈希函数 → 哈希值
下载文件后,计算哈希值与官方提供的值对比,一致则文件完整。
3. 常见哈希算法
| 算法 | 长度 | 安全性 | 用途 |
|---|---|---|---|
| MD5 | 128位 | 已不安全 | 文件校验(非安全场景) |
| SHA-1 | 160位 | 已不安全 | Git提交、旧系统 |
| SHA-256 | 256位 | 安全 | 文件校验、数字签名 |
| SHA-512 | 512位 | 更安全 | 高安全要求场景 |
建议:优先使用 SHA-256,MD5 仅用于非安全场景。
4. Windows 校验方法
PowerShell(推荐):
Get-FileHash 文件名 -Algorithm MD5
Get-FileHash 文件名 -Algorithm SHA256
CertUtil(系统内置):
certutil -hashfile 文件名 MD5
certutil -hashfile 文件名 SHA256
第三方工具:
- HashCheck:右键菜单集成,轻量
- 7-Zip:内置哈希计算(右键 → CRC SHA)
5. Linux/Mac 校验方法
专用命令:
md5sum 文件名
sha256sum 文件名
sha1sum 文件名
shasum(灵活选择算法):
shasum -a 256 文件名 # SHA-256
shasum -a 1 文件名 # SHA-1
shasum 文件名 # 默认 SHA-1
6. 编程语言校验
Go:
package main
import (
"crypto/sha256"
"fmt"
"io"
"os"
)
func main() {
f, _ := os.Open("文件名")
defer f.Close()
h := sha256.New()
io.Copy(h, f)
fmt.Printf("%x\n", h.Sum(nil))
}
Python:
import hashlib
with open("文件名", "rb") as f:
sha256 = hashlib.sha256(f.read()).hexdigest()
print(sha256)
7. 实际应用场景
文件下载:
# 下载后校验
wget https://example.com/file.zip
sha256sum file.zip
# 对比官网提供的哈希值
Git 提交验证:
git log --show-signature # 查看提交签名
软件完整性:
- 操作系统镜像
- 软件安装包
- 重要文档
8. 注意事项
- 哈希值必须从官方渠道获取,不能用文件内附带的
- MD5 已不安全,容易被碰撞攻击,仅用于非安全场景
- 大文件校验耗时较长,耐心等待
- 哈希值相同不代表文件无病毒,只说明文件未被篡改
总结
| 场景 | 推荐算法 | 工具 |
|---|---|---|
| 一般文件校验 | SHA-256 | 系统自带命令 |
| 非安全场景 | MD5 | 系统自带命令 |
| 高安全要求 | SHA-512 | 编程语言实现 |
核心原则:哈希校验只能验证完整性,不能验证安全性。
记住这个区别,正确使用哈希校验。