密码学基础回顾:对称加密与非对称加密、哈希函数、数字签名原理、PKI概念

各位同学,咱们今天聊点实在的。做固件安全,绕不开密码学。说实话,我刚入行那会儿,也觉得这些理论离实际很远。直到有一次,我负责的一个IoT设备因为签名校验没做好,被黑客注入了恶意固件……嗯,从那以后,我再也不敢轻视这些基础概念了。

这一节,咱们就把密码学里跟固件签名、烧录最相关的几个核心知识点捋一遍。别怕,我不跟你扯复杂的数学公式,咱们就讲“怎么用”、“为什么这么用”。

1. 对称加密 vs 非对称加密

先问个问题:你给设备烧录固件,数据在传输过程中被人截获了怎么办?

最简单的办法,就是把数据加密。加密分两种:对称加密和非对称加密。

特性 对称加密 非对称加密
密钥数量 1个(加密和解密用同一个) 2个(公钥加密,私钥解密)
速度 快(适合大数据量) 慢(适合小数据量)
典型算法 AES-128/256 RSA、ECC
应用场景 固件本体加密 密钥交换、数字签名

我个人习惯,在固件烧录场景里,对称加密用来加密固件本身,非对称加密用来保护那个对称密钥。说白了,就是“用非对称加密来安全地传递对称密钥”。

小提示: 实际项目中,我建议固件加密用AES-128就够了。AES-256虽然更安全,但在嵌入式MCU上跑起来,性能开销你懂的。我曾经在一个Cortex-M0的芯片上试过AES-256,结果烧录时间直接翻倍。

2. 哈希函数:SHA256 / SHA384

哈希函数是什么?你可以把它想象成一个“数字指纹”。不管你的固件有多大,经过哈希函数计算后,都会得到一个固定长度的摘要。

比如:

固件文件(1MB) → SHA256 → 64个十六进制字符(256位)
固件文件(1MB) → SHA384 → 96个十六进制字符(384位)

哈希函数有几个关键特性:

  • 单向性:从哈希值反推原始数据,理论上不可能。我试过暴力破解,算到天荒地老也算不出来。
  • 抗碰撞性:很难找到两个不同的输入,产生相同的哈希值。
  • 雪崩效应:输入改一个bit,输出结果完全不一样。

在固件签名中,我们通常不会直接对固件签名,而是先对固件做哈希,再对哈希值签名。为什么?因为签名算法(比如RSA)处理大文件很慢,而哈希值只有几十个字节,快得多。

重要: 我个人建议,新项目尽量用SHA256。SHA384虽然更安全,但很多MCU的硬件加速器只支持SHA256。你想想看,如果硬件不支持,纯软件算SHA384,那速度……嗯,你懂的。

3. 数字签名原理:RSA 与 ECDSA

数字签名,说白了就是“我证明这个固件是我发的,而且没被人改过”。

流程是这样的:

  1. 开发者用私钥对固件的哈希值进行签名,生成签名文件。
  2. 设备端用公钥验证签名。验证通过,说明固件是合法的。

目前主流的两大签名算法:

算法 密钥长度 签名长度 计算开销
RSA-2048 2048位 256字节 中等
RSA-4096 4096位 512字节 较高
ECDSA P-256 256位 64字节 较低
ECDSA P-384 384位 96字节 中等

我曾经在一个项目中,因为选错了签名算法,导致设备启动时间多了2秒。当时用的是RSA-4096,MCU验签一次要1.5秒。后来换成ECDSA P-256,验签时间降到了200毫秒。所以,选算法一定要考虑硬件性能。

避坑指南: 我曾经见过一个团队,把私钥直接硬编码在固件里。结果固件被反编译,私钥泄露,整个产品线的设备都被攻破了。记住:私钥永远不要出现在设备端!设备端只存公钥。

4. 公钥基础设施(PKI)概念

PKI,听起来很高大上,其实就是一个“信任链”体系。

你想想看:设备上存了一个公钥,用来验证固件签名。但这个公钥本身怎么保证是可信的?万一被人换掉了呢?

PKI就是解决这个问题的。它通过证书链来建立信任:

  • 根证书:最顶层的信任锚点,自签名。
  • 中间证书:由根证书签发,用于签发设备证书。
  • 设备证书:包含设备的公钥,由中间证书签发。

在固件签名场景中,我们通常的做法是:

  1. 在工厂烧录时,把根证书或中间证书的公钥烧进设备的OTP(一次性可编程存储器)区域。
  2. 固件发布时,用私钥签名,同时附上证书链。
  3. 设备验证时,先验证证书链的合法性,再用证书里的公钥验证固件签名。
我的经验: 对于小批量产品,直接用自签名证书就够了。但对于大规模量产设备,我建议搭建完整的PKI体系。虽然前期投入大,但后期维护和密钥轮换会方便很多。

知识体系总览

下面这张图,是我自己整理的密码学基础在固件签名中的完整链路。你看一遍,应该就能明白各个模块是怎么配合的了。

固件签名与验证 - 密码学基础链路 开发者侧(签名) 固件二进制 → SHA256哈希 私钥(保密) → RSA/ECDSA签名 固件 + 签名 + 证书链 设备侧(验证) 固件二进制 → SHA256哈希 公钥(OTP存储) → 验签 验证通过 → 允许烧录 验证失败 → 拒绝烧录 PKI信任链:根证书 → 中间证书 → 设备证书(公钥) 公钥通过证书链验证可信性,防止中间人攻击

这张图里,左侧是开发者的签名流程,右侧是设备的验证流程。中间通过PKI证书链来保证公钥的可信性。你看,整个链路其实不复杂,但每一步都环环相扣。

好了,密码学基础就回顾到这里。这些概念在后续的固件签名实战中会反复用到。特别是哈希和签名算法,我建议你亲手在开发板上跑一遍,感受一下不同算法的性能差异。只有亲手踩过坑,才能真正理解为什么选这个算法而不选那个。

可可精品资料库