3. 生成固件镜像的SHA-256哈希

生成固件镜像的SHA-256哈希 学习卡片

任务说明

本案例要求对给定的固件二进制文件计算 SHA-256 哈希值,并输出十六进制摘要。该操作是固件签名、完整性校验和安全启动流程的基础步骤——在后续案例中,生成的摘要将用于固件签名或版本校验。

环境准备

本案例使用 Python 3 标准库 hashlib 实现,无需安装第三方依赖。操作系统不限(Windows/Linux/macOS 均可)。

完整实现代码

import hashlib
import sys
import os

def compute_sha256(file_path: str) -> str:
    """
    计算文件的 SHA-256 哈希值,返回十六进制摘要字符串。
    """
    sha256_hash = hashlib.sha256()
    # 分块读取,避免大文件占用过多内存
    with open(file_path, "rb") as f:
        for chunk in iter(lambda: f.read(4096), b""):
            sha256_hash.update(chunk)
    return sha256_hash.hexdigest()

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("用法: python sha256_firmware.py <固件文件路径>")
        sys.exit(1)

    firmware_path = sys.argv[1]

    if not os.path.isfile(firmware_path):
        print(f"错误: 文件不存在 - {firmware_path}")
        sys.exit(1)

    digest = compute_sha256(firmware_path)
    print(f"SHA-256 ({os.path.basename(firmware_path)}) = {digest}")

运行方式

  1. 将上述代码保存为 sha256_firmware.py。
  2. 准备一个固件文件(例如 firmware.bin),放置于同一目录或指定路径。
  3. 在终端执行:
python sha256_firmware.py firmware.bin

验证方法

运行后观察终端输出,应显示一行以 SHA-256 (firmware.bin) = 开头的 64 位十六进制字符串。判定通过的依据:

  • 程序正常退出,无报错信息;
  • 输出的摘要长度为 64 个十六进制字符(即 256 位);
  • 使用系统命令交叉验证结果一致:
    Linux/macOS: shasum -a 256 firmware.bin
    Windows PowerShell: Get-FileHash firmware.bin -Algorithm SHA256

若两个工具输出的摘要与脚本输出完全一致,则验证通过。

预期输出示例

假设 firmware.bin 内容为字符串 hello firmware(不含引号),则预期输出为:

SHA-256 (firmware.bin) = 8f2b7e5d4c3a9f1e6b8d0c2a4e6f8a1b3c5d7e9f0a1b2c3d4e5f6a7b8c9d0e1f

注意:上述摘要是示意格式,实际值取决于文件内容。请以交叉验证结果为准。