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

前面是哈希值,后面是文件名。两个空格分隔,注意这个格式——写脚本解析的时候容易踩坑。

注意:md5sum输出的哈希值是小写的。有些厂商给的校验文件是大写的,比对之前记得统一大小写。我曾经因为这个低级错误排查了整整两个小时。

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不是加密安全的,它只能检测随机错误,不能防恶意篡改。我在项目中只用它做传输完整性检查,从来不用它做固件发布校验。

我的建议:生产环境用sha256sum做发布校验,用cksum做传输校验。两个工具配合使用,各司其职。

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,理由前面说过了。

小技巧:CertUtil输出的哈希值也是小写的,但中间有空格和换行。如果你要写脚本自动比对,记得用 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 知识体系总览

下面这张图把本章的核心逻辑串起来了。你一看就明白:不同场景该用哪个工具。

固件校验工具选型逻辑 固件镜像校验 手动校验 脚本/自动化校验 Linux: md5sum/sha256sum/cksum Windows: CertUtil/FastSum Python hashlib库 选型建议 • 固件发布校验:sha256sum(Linux)或 CertUtil SHA256(Windows) • 传输完整性检查:cksum(Linux)或 FastSum(Windows) • 自动化测试/批量校验:Python hashlib + 分块读取 • 日常快速验证:md5sum(注意:不防恶意篡改) • 统一格式:比对前务必统一哈希值的大小写

3.6 实战中的选择策略

说了这么多工具,到底怎么选?我根据实际项目经验给你几个原则:

  1. 发布固件用SHA-256——MD5已经不够安全了,SHA-1也在逐步淘汰。SHA-256是目前最稳妥的选择。
  2. 传输校验用CRC——cksum或者Python的zlib.crc32都行。CRC速度快,能检测传输中的比特翻转。
  3. 自动化用Python——hashlib配合分块读取,既能处理大文件,又能集成到CI/CD流水线里。
  4. Windows环境用CertUtil——系统自带,不用装第三方工具。客户现场最省心。
我的习惯:每次发布固件前,我会同时生成SHA-256和CRC32两个校验值。SHA-256给客户做发布验证,CRC32给产线做传输验证。各取所需,互不干扰。

嗯,工具就这些。别贪多,把sha256sum和Python hashlib用熟,90%的场景都能覆盖。剩下的10%,遇到具体问题再查文档也来得及。