密码学基础:对称加密与非对称加密、哈希函数与消息认证码、数字签名原理
各位同学,咱们今天聊的这块内容,是整个固件安全升级的基石。说白了,没有密码学,你做的升级就是裸奔。我在做嵌入式安全这十几年里,见过太多因为密码学基础没打牢,导致整个产品被攻破的案例。嗯,咱们今天就把这几个核心概念掰开揉碎了讲清楚。
对称加密:又快又简单,但有个大麻烦
对称加密,顾名思义,加密和解密用的是同一把钥匙。就像你家里的大门,用一把钥匙锁上,也用同一把钥匙打开。
我最早做固件升级时,用的就是对称加密。当时觉得,这玩意儿多简单啊,速度快,代码量也小,非常适合资源受限的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的防抵赖问题。
流程是这样的:
- 服务器对固件算哈希值
- 用服务器的私钥对哈希值签名
- 把固件+签名一起发给设备
- 设备用服务器的公钥验证签名
因为私钥只有服务器有,所以服务器不能抵赖——这个签名一定是它生成的。设备只要验证签名通过,就能确认固件是来自合法服务器,且没有被篡改。
我的经验:在嵌入式设备上做签名验证,一定要用硬件加速。纯软件算RSA-2048签名验证,在Cortex-M4上可能要几百毫秒,但用硬件加速模块,几十毫秒就搞定了。选MCU时,记得看有没有硬件加密引擎。
知识体系总览
下面这张图,把今天讲的核心概念串起来了。你仔细看看,就能明白它们之间的关系。
实际项目中的选择建议
说了这么多,到底怎么选?我根据自己的经验,给你几个实用建议:
- 固件加密:用对称加密(AES-256或SM4),速度快。密钥用非对称加密保护。
- 固件签名:用数字签名(ECC-256或SM2),防抵赖。先算哈希再签名。
- 完整性校验:用哈希函数(SHA-256或SM3),简单高效。
- 通信认证:如果只是防篡改,用HMAC;如果需要防抵赖,用数字签名。
最后说一句:密码学算法本身是安全的,但实现和部署才是真正的坑。密钥管理、随机数生成、侧信道防护……这些才是实战中真正要命的地方。后面的章节,我会带你一个一个踩过去。