3、密码学基础(下):数字签名、密钥交换(ECDH)、证书与PKI体系、随机数生成

上一节我们把对称加密、非对称加密和哈希函数聊透了。这一节继续往下走,聊几个在车规设备里真正落地时会频繁碰到的概念:数字签名、密钥交换、证书体系,还有那个看似不起眼、实则坑最多的随机数生成。

说实话,我在做T-Box安全启动方案时,这几个东西几乎是天天打交道。你想想看,车上的ECU要验证固件是不是原厂的,V2X要确认对方不是伪装的,这些场景背后全是今天要讲的内容。

3.1 数字签名:不只是“加密的哈希”

很多人把数字签名简单理解为“用私钥加密哈希值”。这个说法在RSA里勉强说得通,但在ECDSA里就不太对了。我更愿意把它理解为:用私钥对一段数据“盖章”,任何人用公钥都能验这个章的真伪。

核心流程:

  1. 发送方对原文做哈希,得到摘要
  2. 用私钥对摘要签名,生成签名值
  3. 发送方把原文 + 签名一起发出去
  4. 接收方用公钥验签,比对哈希是否一致

我在做OTA升级包校验时,遇到过一个问题:签名算法选错了曲线。ECDSA用的是secp256r1,结果固件签名验签耗时超过200ms,ECU直接报看门狗超时。后来换成了Ed25519,性能好了不少。所以选签名算法时,一定要考虑目标芯片的算力。

我的建议:车规场景优先选Ed25519或ECDSA with SHA-256。RSA-2048虽然成熟,但签名太长,验签也慢,不太适合资源受限的MCU。

3.2 ECDH密钥交换:让两个设备“商量”出同一个密钥

ECDH的全称是椭圆曲线Diffie-Hellman。说白了,就是让通信双方在不安全的信道上,各自生成一对公私钥,然后交换公钥,各自算出一个相同的共享密钥。

我记得第一次在CAN总线上做密钥协商时,差点被坑死。ECDH算出来的共享密钥是曲线上的一个点,不能直接当AES密钥用。必须经过KDF(密钥派生函数)处理,才能得到真正的会话密钥。

我曾经踩过的坑:ECDH本身不提供身份认证。中间人攻击可以轻松替换公钥。所以实际部署时,必须配合数字签名或证书来绑定公钥和身份。我在V2X项目中就吃过这个亏,后来老老实实加了证书链校验。

ECDH的流程其实很简洁:

  • Alice生成私钥a,公钥A = a * G
  • Bob生成私钥b,公钥B = b * G
  • Alice计算共享点 S = a * B
  • Bob计算共享点 S = b * A
  • 两人得到相同的S,取x坐标作为共享密钥素材

这里G是椭圆曲线的基点,所有参数都是公开的。安全性完全依赖于私钥a和b的随机性。

3.3 证书与PKI体系:信任的锚点

光有公钥还不够,你怎么知道手里的公钥就是对方的?这就引出了证书和PKI。

证书本质上是一个数字身份证。里面包含了:

  • 主体信息(设备ID、厂商、序列号)
  • 公钥
  • 签发者信息
  • 有效期
  • 签发者的数字签名

PKI体系就是管理这些证书的完整框架。从根CA(证书颁发机构)开始,一层层签发下去,形成证书链。车规设备里,根证书通常预置在HSM(硬件安全模块)中,不可更改。

车规PKI的典型层级:

  1. 根CA(离线保存,极少使用)
  2. 二级CA(用于签发不同车型或产线)
  3. 设备证书(每个ECU或T-Box独有)
  4. 通信证书(用于V2X或远程服务)

我在做车联网平台时,发现很多厂商直接把根证书放在Flash里,没有任何保护。这其实很危险。一旦攻击者拿到根证书私钥,整个PKI体系就崩塌了。正确的做法是:根私钥必须放在离线HSM中,连开发人员都接触不到。

一个小技巧:证书吊销列表(CRL)在车规场景里不太好用,因为ECU不一定能实时联网。可以考虑用短有效期证书(比如24小时过期)来替代CRL,这样即使证书泄露,影响范围也有限。

3.4 随机数生成:安全体系的基石

这个知识点我放在最后,但它的重要性排第一。没有好的随机数,签名、密钥交换、证书生成全是空中楼阁。

随机数分两种:

  • 伪随机数(PRNG):由算法生成,种子相同则序列相同。适合非安全场景。
  • 真随机数(TRNG):基于物理噪声(如热噪声、时钟抖动)。适合密钥生成。

车规芯片里,大部分MCU都内置了TRNG模块。但问题在于,很多工程师直接拿TRNG的输出当密钥用,这其实不对。TRNG的输出可能有偏差,需要经过去偏和熵提取处理。

我曾经踩过的坑:某款MCU的TRNG在低温-40°C时输出熵值下降,生成的密钥重复率高达千分之一。后来我们加了NIST SP 800-90B的熵源健康测试,才把问题堵住。所以,量产前一定要做全温区的随机数质量测试。

好的随机数生成器应该满足:

  • 不可预测性:攻击者无法根据历史输出推断未来输出
  • 均匀分布:0和1的出现概率接近50%
  • 独立性:前后输出之间没有相关性

在代码层面,我建议用标准的DRBG(确定性随机数生成器)来封装TRNG。比如NIST SP 800-90A规定的CTR_DRBG,用AES-CTR模式做生成,既安全又高效。

3.5 本章知识体系总览

下面这张图把今天讲的核心概念串起来了。你仔细看,会发现它们之间是环环相扣的:

密码学基础(下)知识体系 密码学基础(下) 数字签名 ECDH密钥交换 证书与PKI 随机数生成 ECDSA / Ed25519 共享密钥派生 证书链校验 TRNG + DRBG 固件签名校验 KDF派生 CRL / 短证书 熵源健康测试 ⚠ 车规落地关键点 签名算法选型需考虑MCU算力 | ECDH必须配合身份认证 | 随机数要做全温区测试

这张图里,四个模块之间其实有隐含的依赖关系:随机数生成是签名和密钥交换的基础,证书体系又依赖数字签名来保证可信。你想想看,如果随机数出了问题,整个安全体系就像建在沙滩上的城堡。