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 数字签名:证明你是谁,东西没被改
数字签名 = 哈希函数 + 非对称加密。它解决了两个问题:
- 身份认证:证明这个数据确实来自声称的发送方。
- 完整性验证:证明数据在传输过程中没有被篡改。
签名过程:
- 发送方对数据计算哈希值
- 用私钥加密这个哈希值,得到签名
- 把数据和签名一起发送
验证过程:
- 接收方用公钥解密签名,得到哈希值A
- 接收方对收到的数据计算哈希值B
- 如果A == B,说明数据完整且来自合法发送方
我的习惯:在QNX安全启动中,我通常先对固件做哈希,再对哈希值做签名。这样既保证了效率(只对32字节签名),又保证了安全性。你想想看,如果对整个固件签名,RSA签名速度会慢得让你怀疑人生。
2.5 公钥基础设施(PKI):信任的链条
PKI,说白了就是一套管理公钥的体系。你想想,设备里存了一个公钥,你怎么知道这个公钥真的是官方的?万一被换掉了呢?PKI通过证书链来解决这个问题。
核心组件:
- CA(证书颁发机构):权威的第三方,负责签发证书。
- 证书:包含公钥、持有者信息、CA的签名。说白了,就是CA给公钥做了个担保。
- 证书链:从根CA到中间CA到设备证书,一层层签名,形成信任链条。
为什么需要PKI?在QNX安全启动中,设备出厂时只烧录根CA的公钥。后续所有固件更新,都通过证书链验证。这样,即使中间证书泄露,只要根CA安全,整个系统就安全。我曾经见过一个项目,直接把公钥硬编码在Bootloader里,结果换一次公钥就得升级Bootloader,那叫一个痛苦。
证书链验证流程:
- 设备用根CA公钥验证中间CA证书的签名
- 用中间CA公钥验证固件签名证书的签名
- 用固件签名证书的公钥验证固件签名
这样,只要根CA私钥不泄露,整个信任链就是安全的。
避坑指南:我曾经在项目里遇到过证书过期的问题。设备出厂时证书有效,但三年后设备还在运行,证书却过期了。结果安全启动失败,设备变砖。所以,设计PKI时一定要考虑证书的生命周期管理,要么用长期证书,要么设计好证书更新机制。
2.6 小结:这些基础怎么用在QNX安全启动里?
好了,咱们回顾一下:
- 对称加密:用于加密固件传输通道(比如TLS),速度快。
- 非对称加密:用于数字签名,保证固件来源可信。
- 哈希函数:用于固件完整性校验,确保没被篡改。
- 数字签名:身份认证 + 完整性,安全启动的核心。
- PKI:管理公钥信任链,让设备知道该信谁。
在后续章节里,我们会把这些概念一一落地到QNX的代码和配置中。你想想看,当你的设备启动时,Bootloader先验证签名,再加载系统,每一步都有密码学保驾护航——这种感觉,踏实。
下一章,咱们开始动手,看看QNX安全启动的硬件基础:HSM和TEE到底怎么用。