3. 常见校验工具:Linux下md5sum/sha256sum/cksum命令、Windows下CertUtil/FastSum工具、Python hashlib库
校验工具这东西,说白了就是一把尺子。你量固件对不对,得先知道用什么量。我见过不少同事,拿到固件直接开刷,结果刷进去变砖了才想起来校验——晚了。
这一章我把常用的工具给你捋一遍。Linux的、Windows的、还有Python脚本里用的,咱们一个一个说清楚。
3.1 Linux下的三把刀:md5sum、sha256sum、cksum
Linux下做校验,我个人最常用的是 sha256sum。为什么?因为MD5已经被证明有碰撞风险了,虽然日常用问题不大,但做固件校验这种严肃的事,我建议你直接上SHA-256。
3.1.1 md5sum
用法极其简单:
md5sum firmware.bin
输出长这样:
d41d8cd98f00b204e9800998ecf8427e firmware.bin
前面是哈希值,后面是文件名。两个空格分隔,注意这个格式——写脚本解析的时候容易踩坑。
3.1.2 sha256sum
用法和md5sum一模一样:
sha256sum firmware.bin
输出:
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 firmware.bin
SHA-256的哈希值长度是64个十六进制字符。你想想看,256位,碰撞概率几乎可以忽略不计。做固件发布校验,这是行业标准。
3.1.3 cksum
这个工具比较特殊。它算的不是加密哈希,而是CRC校验。用法:
cksum firmware.bin
输出:
4294967295 12345 firmware.bin
三个字段:CRC校验值、字节数、文件名。注意,CRC不是加密安全的,它只能检测随机错误,不能防恶意篡改。我在项目中只用它做传输完整性检查,从来不用它做固件发布校验。
3.2 Windows下的选择:CertUtil和FastSum
Windows没有原生的md5sum命令,但有个好东西叫CertUtil。我第一次在Windows上做固件校验时,找这个命令找了半天——它藏在证书工具里,名字也不直观。
3.2.1 CertUtil
用法:
CertUtil -hashfile firmware.bin SHA256
输出:
SHA256 hash of firmware.bin:
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
CertUtil: -hashfile command completed successfully.
支持的算法有MD5、SHA1、SHA256、SHA384、SHA512。我个人习惯用SHA256,理由前面说过了。
findstr /v 过滤掉非哈希行。
3.2.2 FastSum
这是个第三方工具,但很多嵌入式团队在用。它支持批量校验,还能生成校验文件。用法:
fastsum -c checksum.md5
FastSum的优点是速度快,支持大文件。缺点是它不是系统自带工具,需要额外安装。我一般在客户现场用CertUtil,在自己实验室用FastSum。
3.3 Python hashlib库:脚本化校验的利器
做自动化测试或者批量校验的时候,手动敲命令太慢了。这时候Python的hashlib库就派上用场了。
3.3.1 基本用法
import hashlib
def calculate_sha256(file_path):
sha256_hash = hashlib.sha256()
with open(file_path, "rb") as f:
for byte_block in iter(lambda: f.read(4096), b""):
sha256_hash.update(byte_block)
return sha256_hash.hexdigest()
firmware_hash = calculate_sha256("firmware.bin")
print(firmware_hash)
注意这里用了分块读取,每次4KB。为什么?因为固件镜像可能很大,一次性读入内存会爆。我在处理128MB的固件时遇到过这个问题,改成流式读取就解决了。
3.3.2 支持多种算法
hashlib支持MD5、SHA1、SHA256、SHA512等。切换算法只需要改一行:
hash_obj = hashlib.md5() # 改成MD5
hash_obj = hashlib.sha1() # 改成SHA1
hash_obj = hashlib.sha256() # 改成SHA256
3.3.3 比对校验值
expected_hash = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
actual_hash = calculate_sha256("firmware.bin")
if expected_hash == actual_hash:
print("校验通过")
else:
print("校验失败")
.lower() 或 .upper() 统一格式就解决了。
3.4 工具对比一览
| 工具 | 平台 | 算法 | 适用场景 | 我的推荐 |
|---|---|---|---|---|
| md5sum | Linux | MD5 | 快速校验,非安全场景 | 不推荐用于固件发布 |
| sha256sum | Linux | SHA-256 | 固件发布校验 | 强烈推荐 |
| cksum | Linux | CRC | 传输完整性检查 | 仅用于传输校验 |
| CertUtil | Windows | MD5/SHA1/SHA256等 | Windows环境固件校验 | 推荐SHA256 |
| FastSum | Windows | MD5/SHA1 | 批量校验 | 适合实验室环境 |
| hashlib | Python | MD5/SHA1/SHA256等 | 自动化脚本、批量处理 | 强烈推荐 |
3.5 知识体系总览
下面这张图把本章的核心逻辑串起来了。你一看就明白:不同场景该用哪个工具。
3.6 实战中的选择策略
说了这么多工具,到底怎么选?我根据实际项目经验给你几个原则:
- 发布固件用SHA-256——MD5已经不够安全了,SHA-1也在逐步淘汰。SHA-256是目前最稳妥的选择。
- 传输校验用CRC——cksum或者Python的zlib.crc32都行。CRC速度快,能检测传输中的比特翻转。
- 自动化用Python——hashlib配合分块读取,既能处理大文件,又能集成到CI/CD流水线里。
- Windows环境用CertUtil——系统自带,不用装第三方工具。客户现场最省心。
嗯,工具就这些。别贪多,把sha256sum和Python hashlib用熟,90%的场景都能覆盖。剩下的10%,遇到具体问题再查文档也来得及。