密码学基础回顾:车端必备的几把"钥匙"
说实话,每次带新人做车联网项目,我都要先花半天时间跟他们捋一遍密码学基础。不是他们基础差,而是车端场景太特殊——算力有限、网络不稳定、密钥还不能裸奔。今天我就把这几个核心概念,用我踩过的坑串起来讲。
一句话总结本章:对称加密管速度,非对称加密管分发,哈希管完整性,签名管身份,KDF管派生,ECC管效率。车端一个都不能少。
2.1 对称加密 vs 非对称加密:一个管"锁门",一个管"发钥匙"
对称加密,说白了就是一把钥匙开一把锁。加密和解密用同一个密钥。AES是车端最常用的,128位密钥就够用,256位更安全但稍慢。
非对称加密呢?公钥加密,私钥解密。公钥随便发,私钥自己藏。RSA和ECC是两大主流。RSA在车端有个致命问题——密钥越长,签名越慢。2048位的RSA签名,在老旧ECU上能卡到你怀疑人生。
| 特性 | 对称加密 (AES) | 非对称加密 (ECC/RSA) |
|---|---|---|
| 密钥数量 | 1个 | 2个(公钥+私钥) |
| 速度 | 快(硬件加速常见) | 慢(尤其RSA) |
| 典型用途 | 加密CAN/FlexRay数据 | 密钥交换、数字签名 |
| 车端痛点 | 密钥分发困难 | 计算开销大 |
我的经验:车端实际项目中,我习惯用ECC做密钥协商,协商出来的会话密钥再用AES加密后续通信。这叫"混合加密",既安全又高效。
2.2 哈希函数与数字签名:防篡改的"指纹"和"手印"
哈希函数,就是把任意长度的数据,压缩成固定长度的"指纹"。SHA-256是车端标配。你想想看,一个固件几兆字节,哈希一下变成32字节。升级时比对哈希值,就知道固件有没有被改过。
数字签名呢?就是先用哈希算出指纹,再用私钥加密这个指纹。验证时用公钥解密指纹,重新算一遍哈希,比对是否一致。
我曾经在一个T-Box项目里遇到过OTA升级包被篡改的事。攻击者在中间人位置改了固件,但签名校验没通过——因为哈希值对不上。嗯,从那以后我再也不敢省略签名验证步骤了。
避坑指南:哈希碰撞虽然理论上存在,但SHA-256至今没有实际碰撞案例。别为了省算力用MD5或SHA-1,我在某OEM的ECU里见过用MD5的,吓得我连夜让他们改方案。
2.3 密钥派生函数 (KDF):一个种子生出无数密钥
KDF的作用很简单:从一个主密钥(种子),派生出多个子密钥。为什么要这么做?
- 不同用途用不同密钥:加密用一把,签名用另一把
- 密钥定期轮换:派生时加个计数器就行
- 降低单点风险:主密钥泄露,子密钥全废?不,KDF可以设计成单向的
车端常用的KDF是HKDF(HMAC-based Key Derivation Function)。它有三个输入:
HKDF(salt, input_key_material, info) → output_key_material
- salt:随机数,增加熵
- input_key_material:主密钥
- info:上下文信息,比如"encryption_key_v1"
我个人习惯在车端每个ECU出厂时注入一个唯一主密钥,然后通过HKDF派生出CAN加密密钥、诊断认证密钥、日志加密密钥。这样即使某个子密钥泄露,也不会波及全局。
2.4 椭圆曲线密码学 (ECC):车端的"省油"之选
ECC为什么适合车端?因为同样的安全强度下,ECC的密钥更短、计算更快。
| 安全等级 | RSA密钥长度 | ECC密钥长度 |
|---|---|---|
| 80位 | 1024位 | 160位 |
| 112位 | 2048位 | 224位 |
| 128位 | 3072位 | 256位 |
| 256位 | 15360位 | 512位 |
你看,128位安全等级下,ECC只要256位密钥,RSA要3072位。在车端那点可怜的Flash和RAM里,这个差距是致命的。
ECC在车端的主要应用场景:
- 数字签名:ECDSA,用于固件签名、V2X通信
- 密钥交换:ECDH,用于建立会话密钥
- 证书体系:车端证书通常用ECC密钥对
我的建议:新项目直接上ECC,别再用RSA了。但要注意,ECC的曲线选择很重要。车端推荐使用NIST P-256或Curve25519。P-256硬件支持更广,Curve25519性能更好且没有专利问题。
2.5 知识体系总览
下面这张图,把本章的核心知识点串起来了。你可以把它当作车端密码学的"地图"。
2.6 车端选型建议
最后,我根据实际项目经验,给出一份车端密码学选型清单:
- 对称加密:AES-128-GCM(带认证加密,防重放)
- 非对称加密:ECC P-256 或 Curve25519
- 哈希函数:SHA-256
- 数字签名:ECDSA 或 Ed25519
- 密钥派生:HKDF-SHA256
- 随机数生成:硬件TRNG(真随机数生成器)
重要提醒:千万别自己实现密码算法。用成熟的库,比如OpenSSL、mbedTLS、WolfSSL。我曾经见过一个团队自己写AES,结果侧信道攻击直接泄露了密钥。嗯,专业的事交给专业的库。
好了,密码学基础就回顾到这里。这些概念在后面章节会反复用到——尤其是密钥托管和自管架构中,ECC证书体系和KDF派生策略是核心中的核心。