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

各位同学,咱们今天聊点硬核的。安全启动证书链管理,说白了就是一套「信任传递」的机制。但信任怎么建立?靠的就是密码学。我做了这么多年嵌入式安全,见过太多因为密码学基础不牢,导致整个安全体系崩塌的案例。所以这一章,咱们把三个核心工具彻底讲透:哈希函数、非对称加密、数字签名。

2.1 哈希函数:数据的「指纹」

哈希函数,你想想看,它就是个单向的压缩器。输入任意长度的数据,输出固定长度的摘要。这个摘要,就是数据的「指纹」。

核心特性:

  • 单向性:从摘要反推原始数据,计算上不可行。说白了,就是有去无回。
  • 抗碰撞性:找到两个不同输入,产生相同摘要,极其困难。
  • 雪崩效应:输入改一个比特,输出就面目全非。

我在项目中遇到过一件事:有个同事用 MD5 做固件完整性校验。我当时就问他,MD5 已经被证明有碰撞攻击了,你这不是给攻击者留后门吗?他还不信。后来我们做了个实验,用工具构造了两个不同固件,MD5 值一模一样。他当场就服了。

避坑指南:我曾经见过不少产品还在用 MD5 或 SHA-1。记住,现在安全启动领域,最低标准是 SHA-256。别为了省那点计算资源,把整个系统卖了。

常见的哈希算法对比如下:

算法 输出长度 安全状态 推荐场景
MD5 128 位 已破解 不推荐
SHA-1 160 位 已破解 不推荐
SHA-256 256 位 安全 固件校验、证书指纹
SHA-384 384 位 安全 高安全场景
SHA-512 512 位 安全 极高安全场景

2.2 非对称加密:公钥与私钥的「双人舞」

对称加密就像一把钥匙开一把锁,双方得共享同一个密钥。但非对称加密不一样,它有一对密钥:公钥公开,私钥保密。

我个人习惯把公钥想象成「锁」,私钥想象成「钥匙」。你把锁(公钥)发给全世界,别人用这把锁把数据锁起来,只有你手里的钥匙(私钥)能打开。反过来,你用私钥加密数据,别人用公钥验证——这就是数字签名的雏形。

2.2.1 RSA:老牌劲旅

RSA 基于大整数分解难题。两个大素数相乘容易,但分解回去极难。我刚开始做安全启动时,用的就是 RSA-2048。那时候觉得 1024 位就够了,后来发现随着计算能力提升,1024 位已经不够安全了。

个人建议:现在做安全启动,RSA 至少 2048 位,推荐 4096 位。但要注意,RSA 的密钥生成和签名运算都比较慢,尤其是在资源受限的嵌入式设备上。

2.2.2 ECC:后起之秀

ECC(椭圆曲线密码学)基于椭圆曲线离散对数难题。同样的安全强度,ECC 的密钥长度比 RSA 短得多。举个例子:

安全强度 RSA 密钥长度 ECC 密钥长度
80 位 1024 位 160 位
112 位 2048 位 224 位
128 位 3072 位 256 位
256 位 15360 位 512 位

你看,要达到 128 位安全强度,RSA 需要 3072 位,而 ECC 只要 256 位。在嵌入式设备上,这差距意味着更快的运算、更少的存储、更低的功耗。

嗯,这里要注意:ECC 虽然好,但实现起来比 RSA 复杂。曲线参数选错了,整个系统就废了。我个人推荐使用 NIST P-256 或 Curve25519,这两个曲线经过充分验证,社区支持也好。

2.3 数字签名:证明「你是谁」和「你没改过」

数字签名,说白了就是「私钥加密,公钥验证」。但实际应用中,我们不会直接对原始数据签名,那样太慢了。正确的做法是:

  1. 对原始数据计算哈希值
  2. 用私钥对哈希值签名
  3. 把原始数据和签名一起发送

验证方收到后,用公钥解密签名得到哈希值,再自己算一遍原始数据的哈希值。两个值一致,说明数据没被篡改,且签名确实来自私钥持有者。

为什么先哈希再签名?

  • 性能:哈希运算快,签名运算慢。对大文件签名,先哈希再签名,效率提升几个数量级。
  • 安全:哈希函数把任意长度数据变成固定长度摘要,避免了签名算法对长数据的处理漏洞。

我曾经在调试一个安全启动流程时,发现签名验证总是失败。查了半天,原来是签名时用的哈希算法是 SHA-256,但验证时用的却是 SHA-1。这种低级错误,一旦上线就是灾难。

避坑指南:签名和验证必须使用完全相同的哈希算法、填充方式、密钥对。任何参数不匹配,验证都会失败。我建议在代码里把这些参数定义成常量,不要留任何配置接口。

2.4 三者如何协同工作?

在安全启动证书链中,这三个工具是这样配合的:

  • 哈希函数:用于校验固件镜像的完整性,生成证书指纹。
  • 非对称加密:用于证书签发,根 CA 用私钥签署下级证书。
  • 数字签名:用于验证固件是否由合法发布者签发,且未被篡改。

下面这张图展示了它们之间的关系:

密码学基础关系图 密码学基础:哈希、非对称加密、数字签名关系 哈希函数 非对称加密 数字签名 提供摘要 提供密钥对 安全启动证书链管理 核心流程 1. 哈希函数对固件计算摘要(完整性校验) 2. 非对称加密提供公钥/私钥对(身份认证) 3. 数字签名用私钥签名摘要,公钥验证(防篡改+防抵赖)

你看,这三个工具不是孤立的。哈希函数为数字签名提供高效的摘要,非对称加密为数字签名提供密钥对。三者结合,才构成了安全启动的信任基础。

我的经验:在嵌入式设备上实现这些算法时,一定要考虑硬件加速。很多 MCU 内置了硬件哈希引擎和 RSA/ECC 加速器。用硬件加速,签名验证能从秒级降到毫秒级。别傻乎乎地纯软件实现,那是给自己找麻烦。