密码学基础:对称加密与非对称加密、哈希函数与消息认证码、数字签名原理

各位同学,咱们今天聊的这块内容,是整个固件安全升级的基石。说白了,没有密码学,你做的升级就是裸奔。我在做嵌入式安全这十几年里,见过太多因为密码学基础没打牢,导致整个产品被攻破的案例。嗯,咱们今天就把这几个核心概念掰开揉碎了讲清楚。

对称加密:又快又简单,但有个大麻烦

对称加密,顾名思义,加密和解密用的是同一把钥匙。就像你家里的大门,用一把钥匙锁上,也用同一把钥匙打开。

我最早做固件升级时,用的就是对称加密。当时觉得,这玩意儿多简单啊,速度快,代码量也小,非常适合资源受限的MCU。常用的算法有AES、DES、SM4(国密)。

核心要点:对称加密的加解密速度非常快,通常比非对称加密快1000倍以上。在固件升级场景中,适合加密固件镜像本身。

但问题来了——密钥怎么分发?你想想看,如果我把固件用AES加密了,那把解密的密钥怎么安全地送到设备上?如果密钥在传输过程中被截获,那加密就等于白干。

算法 密钥长度 特点 我在项目中踩过的坑
AES-128 128位 速度快,硬件加速常见 曾经把密钥硬编码在代码里,结果被反编译读出来了
AES-256 256位 安全性更高,但稍慢 在低端MCU上跑,性能扛不住
SM4 128位 国密标准,国内项目必用 很多开源库实现有坑,得仔细验证

避坑指南:我曾经在一个IoT项目中,直接把AES密钥写死在Flash里。结果产品上市后,竞争对手用JTAG把固件dump出来,密钥一览无余。从那以后,我再也不敢把密钥明文存Flash了。

非对称加密:解决了密钥分发,但慢得让人着急

非对称加密,也叫公钥密码体制。它有一对钥匙:公钥和私钥。公钥可以公开,私钥自己藏着。用公钥加密的数据,只有对应的私钥能解开;反过来,用私钥签名的数据,公钥可以验证。

这玩意儿解决了对称加密的密钥分发难题。你想想看,设备出厂时烧录一个公钥,服务器用私钥签名固件,设备用公钥验证签名——整个过程不需要传输密钥,多安全。

常用的算法有RSA、ECC(椭圆曲线)、SM2(国密)。

我的建议:在固件升级场景中,我一般用非对称加密来做签名验证,而不是加密整个固件。因为非对称加密太慢了,加密一个几MB的固件,服务器端可能还好,但设备端解密会卡死。所以,实际项目中常用的是混合方案:用非对称加密保护对称密钥,用对称密钥加密固件。

算法 密钥长度 签名速度 验证速度 适用场景
RSA-2048 2048位 慢 较快 兼容性好,但密钥太长
ECC-256 256位 快 快 适合嵌入式,密钥短
SM2 256位 快 快 国密项目强制使用

哈希函数:固件的指纹

哈希函数,也叫散列函数。它能把任意长度的数据,压缩成固定长度的摘要。这个摘要就像数据的指纹——只要原始数据改了一个bit,摘要就会完全不一样。

常用的有SHA-256、SHA-3、SM3(国密)。

我在项目中,哈希函数主要干两件事:

  • 完整性校验:固件下载完后,算一下哈希值,跟服务器给的对比,看有没有被篡改。
  • 配合签名:先对固件算哈希,再对哈希值签名。这样就不用签名整个大固件了,效率高很多。

重要提醒:MD5和SHA-1已经被证明不安全了,千万别再用。我见过有同行还在用MD5做固件校验,结果被碰撞攻击轻松绕过。现在最低标准是SHA-256。

消息认证码(MAC):防篡改,但不防抵赖

消息认证码,说白了就是带密钥的哈希。它跟哈希函数一样,能保证数据完整性,但多了一个密钥。只有知道密钥的人,才能生成正确的MAC值。

常用的有HMAC-SHA256、CMAC-AES。

但MAC有个问题——它不能防抵赖。因为通信双方都知道密钥,所以如果A给B发了一条消息,B可以自己伪造一条消息,然后说这就是A发的。因为B也有密钥,他也能生成合法的MAC。

我曾经踩过的坑:在一个车联网项目中,我用HMAC做固件升级的认证。结果后来发现,攻击者通过逆向分析,从一台设备里提取出了HMAC密钥,然后就能伪造固件包发给其他设备了。因为所有设备用的都是同一个密钥。从那以后,我改用数字签名了。

数字签名:真正的防抵赖方案

数字签名,是非对称加密+哈希函数的完美结合。它解决了MAC的防抵赖问题。

流程是这样的:

  1. 服务器对固件算哈希值
  2. 用服务器的私钥对哈希值签名
  3. 把固件+签名一起发给设备
  4. 设备用服务器的公钥验证签名

因为私钥只有服务器有,所以服务器不能抵赖——这个签名一定是它生成的。设备只要验证签名通过,就能确认固件是来自合法服务器,且没有被篡改。

我的经验:在嵌入式设备上做签名验证,一定要用硬件加速。纯软件算RSA-2048签名验证,在Cortex-M4上可能要几百毫秒,但用硬件加速模块,几十毫秒就搞定了。选MCU时,记得看有没有硬件加密引擎。

知识体系总览

下面这张图,把今天讲的核心概念串起来了。你仔细看看,就能明白它们之间的关系。

密码学基础 - 固件升级安全知识体系 对称加密 AES / SM4 非对称加密 RSA / ECC / SM2 哈希函数 SHA-256 / SM3 混合加密方案 非对称加密保护对称密钥 消息认证码 HMAC / CMAC 数字签名 哈希 + 非对称加密 MAC vs 数字签名 MAC:防篡改,但不能防抵赖 数字签名:防篡改 + 防抵赖 固件升级安全应用

实际项目中的选择建议

说了这么多,到底怎么选?我根据自己的经验,给你几个实用建议:

  • 固件加密:用对称加密(AES-256或SM4),速度快。密钥用非对称加密保护。
  • 固件签名:用数字签名(ECC-256或SM2),防抵赖。先算哈希再签名。
  • 完整性校验:用哈希函数(SHA-256或SM3),简单高效。
  • 通信认证:如果只是防篡改,用HMAC;如果需要防抵赖,用数字签名。

最后说一句:密码学算法本身是安全的,但实现和部署才是真正的坑。密钥管理、随机数生成、侧信道防护……这些才是实战中真正要命的地方。后面的章节,我会带你一个一个踩过去。