2、密码学基础回顾:对称加密与非对称加密、哈希函数与数字签名、公钥基础设施(PKI)概念

各位同学,咱们今天聊点基础但极其重要的东西——密码学。你别看它理论性强,在QNX安全启动里,每一步都离不开它。我当年刚接触嵌入式安全时,总觉得密码学是数学家的事,直到在项目里被证书链折腾得焦头烂额,才明白这些基础概念就是你的护身符。

2.1 对称加密:简单粗暴,但小心密钥

对称加密,说白了就是加密和解密用同一把钥匙。你想想看,就像你家大门,用一把钥匙锁上,也用同一把钥匙打开。常见的算法有AES、DES、SM4(国密)。

核心特点:

  • 速度快:适合加密大量数据。我在做OTA升级包加密时,用的就是AES-256-GCM,几兆的固件几秒钟就搞定。
  • 密钥分发难:这是最大的痛点。你想想,如果我把加密的固件发给一万台设备,那这一万把相同的钥匙怎么安全地送到每个设备手里?

重要概念:对称加密的安全性完全依赖于密钥的保密性。密钥一旦泄露,加密形同虚设。

举个实际例子:

// 伪代码:AES加密固件
uint8_t key[32] = {0x2b, 0x7e, ...}; // 256位密钥
uint8_t plaintext[] = "QNX安全启动固件v2.1";
uint8_t ciphertext[256];

aes_encrypt(plaintext, ciphertext, key);
// 现在ciphertext可以安全传输了,但接收方必须有同样的key才能解密

我的经验:在QNX系统里,我习惯把对称密钥存储在HSM(硬件安全模块)或TEE(可信执行环境)中,绝不让它裸奔在文件系统里。曾经有个项目,有人把密钥硬编码在代码里,结果被反编译出来……嗯,那场面很尴尬。

2.2 非对称加密:公钥私钥,天生一对

非对称加密就聪明多了。它有一对钥匙:公钥(Public Key)和私钥(Private Key)。公钥可以公开,私钥自己藏好。用公钥加密的数据,只有对应的私钥能解开;反过来,用私钥签名的数据,公钥可以验证。

常见算法:RSA、ECC(椭圆曲线)、SM2(国密)。

为什么需要它?你想想看,在安全启动场景里,设备要验证固件是不是来自官方。如果用对称加密,设备里得存一把密钥,那这把密钥万一被提取出来,攻击者就能伪造固件了。非对称加密解决了这个问题——设备里只存公钥,私钥留在服务器端,安全多了。

核心区别:

特性 对称加密 非对称加密
密钥数量 1个(共享密钥) 2个(公钥+私钥)
速度 快(适合大数据) 慢(适合小数据)
密钥分发 困难 容易(公钥随便发)
典型用途 数据加密 数字签名、密钥交换

实际应用:在QNX安全启动中,非对称加密主要用于签名验证。服务器用私钥对固件哈希值签名,设备用公钥验证签名。这样,只要私钥不泄露,固件就不可能被篡改。

2.3 哈希函数:数据的指纹

哈希函数,你可以把它想象成给数据按个指纹。不管数据多大,哈希函数都会输出一个固定长度的摘要(比如SHA-256输出32字节)。而且,只要数据改了一个比特,哈希值就完全变了。

关键特性:

  • 单向性:从哈希值无法反推出原始数据。说白了,就是有去无回。
  • 抗碰撞性:很难找到两个不同的数据,它们的哈希值相同。
  • 固定输出:无论输入是1KB还是1GB,输出长度固定。

注意:MD5和SHA-1已经被证明不够安全了。我在项目中一律使用SHA-256或SHA-3。曾经有个老项目还在用MD5做固件校验,结果被碰撞攻击了……从那以后,我见到MD5就头疼。

代码示例:

// 计算固件哈希
uint8_t firmware[] = "QNX安全启动镜像";
uint8_t hash[32]; // SHA-256输出32字节

sha256(firmware, sizeof(firmware), hash);
// hash值就是固件的唯一指纹

2.4 数字签名:证明你是谁,东西没被改

数字签名 = 哈希函数 + 非对称加密。它解决了两个问题:

  1. 身份认证:证明这个数据确实来自声称的发送方。
  2. 完整性验证:证明数据在传输过程中没有被篡改。

签名过程:

  • 发送方对数据计算哈希值
  • 用私钥加密这个哈希值,得到签名
  • 把数据和签名一起发送

验证过程:

  • 接收方用公钥解密签名,得到哈希值A
  • 接收方对收到的数据计算哈希值B
  • 如果A == B,说明数据完整且来自合法发送方

我的习惯:在QNX安全启动中,我通常先对固件做哈希,再对哈希值做签名。这样既保证了效率(只对32字节签名),又保证了安全性。你想想看,如果对整个固件签名,RSA签名速度会慢得让你怀疑人生。

2.5 公钥基础设施(PKI):信任的链条

PKI,说白了就是一套管理公钥的体系。你想想,设备里存了一个公钥,你怎么知道这个公钥真的是官方的?万一被换掉了呢?PKI通过证书链来解决这个问题。

核心组件:

  • CA(证书颁发机构):权威的第三方,负责签发证书。
  • 证书:包含公钥、持有者信息、CA的签名。说白了,就是CA给公钥做了个担保。
  • 证书链:从根CA到中间CA到设备证书,一层层签名,形成信任链条。

为什么需要PKI?在QNX安全启动中,设备出厂时只烧录根CA的公钥。后续所有固件更新,都通过证书链验证。这样,即使中间证书泄露,只要根CA安全,整个系统就安全。我曾经见过一个项目,直接把公钥硬编码在Bootloader里,结果换一次公钥就得升级Bootloader,那叫一个痛苦。

证书链验证流程:

  1. 设备用根CA公钥验证中间CA证书的签名
  2. 用中间CA公钥验证固件签名证书的签名
  3. 用固件签名证书的公钥验证固件签名

这样,只要根CA私钥不泄露,整个信任链就是安全的。

避坑指南:我曾经在项目里遇到过证书过期的问题。设备出厂时证书有效,但三年后设备还在运行,证书却过期了。结果安全启动失败,设备变砖。所以,设计PKI时一定要考虑证书的生命周期管理,要么用长期证书,要么设计好证书更新机制。

2.6 小结:这些基础怎么用在QNX安全启动里?

好了,咱们回顾一下:

  • 对称加密:用于加密固件传输通道(比如TLS),速度快。
  • 非对称加密:用于数字签名,保证固件来源可信。
  • 哈希函数:用于固件完整性校验,确保没被篡改。
  • 数字签名:身份认证 + 完整性,安全启动的核心。
  • PKI:管理公钥信任链,让设备知道该信谁。

在后续章节里,我们会把这些概念一一落地到QNX的代码和配置中。你想想看,当你的设备启动时,Bootloader先验证签名,再加载系统,每一步都有密码学保驾护航——这种感觉,踏实。

下一章,咱们开始动手,看看QNX安全启动的硬件基础:HSM和TEE到底怎么用。