3、密码学基础:哈希算法(SHA256)、非对称加密(RSA/ECC)、数字签名原理

各位好,我是老周。今天咱们聊点硬核的——密码学基础。别被这名字吓到,说白了,安全启动的整个信任链,就是靠这几个算法撑起来的。我做了这么多年嵌入式安全,见过太多因为密码学选型翻车的案例。嗯,咱们一个一个来拆解。

3.1 哈希算法:数据的“指纹”

哈希算法,你可以把它想象成给数据盖个章。不管输入是一行代码还是一张照片,它都能给你算出一个固定长度的摘要。这个摘要,就是数据的“指纹”。

我个人最常用的哈希算法是 SHA256。为什么是它?因为它的输出是 256 位,也就是 32 个字节。这个长度在安全性和性能之间取得了很好的平衡。

SHA256 的核心特性:

  • 单向性:从摘要反推原始数据,几乎不可能。我试过暴力破解,算到天荒地老。
  • 抗碰撞性:找到两个不同数据,但摘要相同,概率极低。理论上存在,但现实中你碰不到。
  • 雪崩效应:输入改一个比特,输出会有一半以上的比特发生变化。这特性在检测篡改时特别好用。

在安全启动里,我们通常用 SHA256 来校验固件的完整性。比如,你烧录固件时,先算一个哈希值存起来。下次启动时,再算一遍,对比一下。不一样?那说明固件被人动过手脚了。

避坑指南:我曾经在一个项目里,看到有人用 MD5 做固件校验。MD5 已经被证明有碰撞漏洞了,攻击者可以构造一个恶意固件,但哈希值跟原版一样。这等于给攻击者留了后门。所以,别再用 MD5 了,至少用 SHA256。

3.2 非对称加密:公钥与私钥的“双人舞”

非对称加密,跟咱们平时用的对称加密不一样。对称加密就像一把钥匙开一把锁,加密解密用同一个密钥。而非对称加密,用的是两把钥匙:公钥和私钥。

公钥可以公开,谁都能拿到。私钥必须保密,只有你自己知道。这两把钥匙是配对的,用公钥加密的数据,只能用私钥解密;反过来,用私钥加密的数据,只能用公钥解密。

在嵌入式领域,最主流的非对称加密算法是 RSA 和 ECC。

特性 RSA ECC
安全性基础 大整数分解 椭圆曲线离散对数
密钥长度 2048 位起 256 位起
计算速度 慢(尤其私钥操作) 快
资源消耗 高 低
典型应用 数字签名、密钥交换 数字签名、密钥交换

你看,ECC 在同等安全强度下,密钥长度更短,计算更快。这对资源受限的嵌入式设备来说,简直是福音。我个人习惯,新项目优先考虑 ECC,尤其是 P-256 曲线。

注意:RSA 虽然老,但生态成熟。很多安全芯片和 BootROM 都内置了 RSA 加速引擎。如果你的硬件只支持 RSA,那就别硬上 ECC,否则软件实现会拖慢启动速度。我踩过这个坑,后来老老实实用了 RSA。

3.3 数字签名:给固件“上锁”

数字签名,是非对称加密的经典应用。它的作用,就是证明一段数据确实来自某个实体,并且没有被篡改过。

签名过程是这样的:

  1. 发送方对固件计算哈希值。
  2. 发送方用私钥对这个哈希值进行加密,得到签名。
  3. 发送方把固件和签名一起发给接收方。

验签过程是这样的:

  1. 接收方收到固件和签名。
  2. 接收方用公钥解密签名,得到哈希值 A。
  3. 接收方对固件计算哈希值 B。
  4. 对比 A 和 B。如果一致,说明固件是完整的,且来自私钥持有者。

在安全启动里,这个流程就是信任链的基石。BootROM 里固化了公钥,它用这个公钥去验签下一级 Bootloader 的签名。验签通过,才加载执行。这样一级一级传递信任,直到操作系统。

核心逻辑:数字签名 = 哈希算法 + 非对称加密。哈希保证完整性,非对称加密保证真实性。两者缺一不可。

3.4 知识体系图:密码学在安全启动中的位置

下面这张图,是我自己画的。它把咱们刚才讲的内容串起来了。你仔细看看,就能明白这些算法在安全启动里是怎么配合的。

密码学在安全启动中的知识体系 密码学在安全启动中的知识体系 哈希算法 (SHA256) 非对称加密 (RSA/ECC) 数字签名 特性 • 单向性 • 抗碰撞性 • 雪崩效应 对比 • RSA: 大整数分解 • ECC: 椭圆曲线 • ECC 更轻量 组成 • 哈希 + 非对称加密 • 保证完整性与真实性 • 信任链的基石 安全启动流程:BootROM → Bootloader → OS 公钥验签 Bootloader 公钥验签 OS 内核 说明:每一级启动前,都需用公钥验签下一级固件的数字签名,验签通过才加载执行。

3.5 实战中的选择建议

说了这么多,到底该怎么选?我根据经验,给你几个建议:

  • 哈希算法:无脑选 SHA256。别问为什么,问就是安全、成熟、够用。
  • 非对称加密:如果硬件支持 ECC,优先用 ECC P-256。如果硬件只支持 RSA,那就用 RSA 2048 位以上。
  • 数字签名:签名算法要和哈希算法配套。比如,用 ECDSA 签名时,哈希用 SHA256。别混搭,容易出问题。

个人经验:我做过一个项目,芯片只有 64KB Flash,跑 RSA 2048 位签名,验签一次要 3 秒。后来换成 ECC P-256,验签时间降到 0.5 秒。启动速度直接起飞。所以,硬件选型时,一定要考虑密码学算法的性能。

好了,这一章的内容就到这。密码学是安全启动的根基,理解透了,后面讲信任链、安全存储、防回滚这些,你就能轻松跟上。咱们下章见。