《固件安全升级实战演练》
第4章 固件签名与验证

4、固件签名与验证:数字签名原理与流程

4.1 数字签名核心原理

数字签名是固件安全升级的基石,它通过非对称加密技术确保固件的完整性、真实性和不可否认性。常见的签名算法包括 RSA 和 ECDSA。

发送方(签名者) 固件数据 哈希值 H(M) 私钥 (Private Key) 数字签名 S 接收方(验证者) 公钥 (Public Key) 签名算法 S = Sign(H(M), PrivateKey) 验证算法 Verify(H(M), S, PublicKey)
特性 RSA ECDSA
安全性基础 大整数分解难题 椭圆曲线离散对数难题
密钥长度(等效128位安全) 3072 位 256 位
签名速度 较慢 较快
验证速度 较快 较快
签名大小 与密钥长度相同 约 64 字节(256位曲线)
典型应用 传统系统、兼容性要求高 物联网、资源受限设备

4.2 固件签名流程

固件签名在开发阶段由固件发布者执行,确保固件在传输前已被合法授权且未被篡改。

步骤1 生成固件二进制 步骤2 计算哈希值 步骤3 使用私钥签名 步骤4 生成签名 固件发布包结构 固件数据 (Firmware) 数字签名 元数据/版本号 📦 签名后的固件包 🔐 安全存储私钥 (HSM / 安全元件)
固件签名示例(使用 OpenSSL + RSA)
# 1. 生成 RSA 私钥(2048位)
openssl genrsa -out private_key.pem 2048

# 2. 提取公钥
openssl rsa -in private_key.pem -pubout -out public_key.pem

# 3. 计算固件哈希并签名
openssl dgst -sha256 -sign private_key.pem -out firmware.sig firmware.bin

# 4. 打包固件与签名
tar -czf firmware_package.tar.gz firmware.bin firmware.sig version.txt

4.3 固件验签流程

验签过程在目标设备上执行,设备使用预置的公钥验证固件的合法性和完整性,防止恶意固件被加载。

输入 签名固件包 解包 分离固件 + 签名 计算哈希 H(M) = SHA256(固件) 验证 🔑 设备公钥(不可变) ✅ 验证通过 ❌ 验证失败 拒绝启动 / 进入恢复模式 允许升级 / 正常启动
固件验签示例(使用 OpenSSL)
# 1. 解包固件
tar -xzf firmware_package.tar.gz

# 2. 计算固件哈希并验证签名
openssl dgst -sha256 -verify public_key.pem \
  -signature firmware.sig firmware.bin

# 3. 检查返回值(0 表示验证成功)
if [ $? -eq 0 ]; then
    echo "✅ 签名验证成功,固件可信!"
    # 执行固件升级...
else
    echo "❌ 签名验证失败,固件可能被篡改!"
    exit 1
fi
⚠️ 安全注意事项:
  • 公钥必须安全存储在设备不可篡改的区域(如一次性可编程存储器 OTP、安全元件)
  • 私钥必须严格保护,建议使用硬件安全模块(HSM)存储
  • 签名算法应选择足够强度的密钥长度(RSA ≥ 2048位,ECDSA ≥ 256位)
  • 哈希算法推荐使用 SHA-256 或更高强度
  • 验证失败时应拒绝固件加载,并记录安全日志