2、密码学基础(上):对称加密与非对称加密、哈希函数、数字签名原理
各位同学,欢迎来到《OTA升级中的签名与证书管理实战》的第二讲。
今天咱们聊点硬核的——密码学基础。我知道,一听到「密码学」三个字,很多人脑子里就开始浮现各种复杂的数学公式。别担心,我尽量用大白话讲清楚。
做OTA升级,说白了就是在「不安全」的信道上干「安全」的事。车机要下载固件,服务器要下发指令,中间要是被人篡改了怎么办?这就得靠密码学来保驾护航。
我个人习惯把密码学比作「锁和钥匙」的游戏。你想想看,我们平时锁门、开锁,跟加密、解密是不是一个道理?
2.1 对称加密:一把钥匙开一把锁
对称加密,顾名思义,加密和解密用的是同一把钥匙。就像你家里的门锁,用同一把钥匙锁门和开门。
它的优点是快,非常快。我在做早期的OTA项目时,固件包动辄几百兆,如果用非对称加密去搞,那速度慢得让人抓狂。所以,对于大块数据的加密,我们通常用对称加密。
核心流程:
- 发送方用密钥K加密明文,得到密文。
- 接收方用同一个密钥K解密密文,得到明文。
常见的对称加密算法有:
- AES(高级加密标准):目前最主流的算法。我个人推荐AES-256,安全强度足够。
- DES(数据加密标准):老古董了,密钥太短,现在基本不用。
- SM4(国密算法):国内的标准,做车规级项目经常会遇到。
⚠️ 避坑指南:
我曾经在一个项目里,同事直接把密钥硬编码在代码里。结果固件被反编译,密钥直接暴露。嗯,这里要注意:对称加密最大的痛点就是密钥分发。你想想,如果密钥在传输过程中被截获,那加密就等于白干。
所以,对称加密适合「一对一的、安全的信道」里使用。但在OTA场景下,服务器要给成千上万台车发密钥,怎么安全地把密钥送过去?这就引出了非对称加密。
2.2 非对称加密:公钥和私钥的二人转
非对称加密,它有两把钥匙:一把叫公钥,可以公开给所有人;一把叫私钥,必须自己藏好,谁都不能给。
它的核心逻辑是:公钥加密,私钥解密。或者反过来,私钥签名,公钥验签。
举个例子:
- 你想给我发个秘密消息,就用我的公钥加密。消息传到我这里,只有我的私钥能解开。就算中间人拿到了密文和公钥,他也解不开。
- 反过来,我用私钥给一份文件签名,你拿我的公钥一验,就知道这文件确实是我发的,没被篡改过。
常见的非对称加密算法:
- RSA:应用最广,但密钥越长越安全,也越慢。2048位是底线。
- ECC(椭圆曲线密码学):用更短的密钥达到同等安全强度。我个人比较喜欢ECC,因为它算得快,适合资源受限的嵌入式设备。
- SM2(国密算法):基于ECC的国产算法,现在很多车厂都在推。
💡 我的经验:
在OTA升级中,我们通常用非对称加密来传递对称密钥。具体做法是:服务器用设备的公钥加密一个临时生成的AES密钥,设备收到后用私钥解密,拿到AES密钥。之后,固件包就用这个AES密钥进行对称加密传输。这样既保证了密钥分发的安全性,又兼顾了传输效率。
2.3 哈希函数:数据的「指纹」
哈希函数,也叫散列函数。它能把任意长度的数据,压缩成固定长度的「摘要」。这个摘要就像人的指纹,独一无二。
它的特点:
- 不可逆:从摘要无法反推出原始数据。
- 抗碰撞:很难找到两个不同的数据,它们的哈希值相同。
- 雪崩效应:原始数据改一个比特,哈希值就面目全非。
常见的哈希算法:
- MD5:已经被证明不安全,容易碰撞。别用了。
- SHA-1:也有理论上的碰撞风险,逐渐被淘汰。
- SHA-256:目前最安全的选择。我所有项目都默认用这个。
- SM3(国密算法):国内标准,安全性对标SHA-256。
哈希在OTA中的作用:
我们下载完固件包后,第一件事就是计算它的哈希值,然后跟服务器下发的哈希值对比。如果一致,说明固件包在传输过程中没被篡改。如果不一致,那对不起,直接丢弃,重新下载。
你可能会问:「哈希函数能保证数据完整性,但能保证数据来源的真实性吗?」不能。因为哈希值本身也可能被篡改。这时候,就需要数字签名出场了。
2.4 数字签名:给数据盖个章
数字签名,说白了就是「私钥签名,公钥验签」。它解决了三个问题:
- 身份认证:确认数据确实来自声称的发送方。
- 数据完整性:确认数据在传输过程中没被改过。
- 不可否认性:发送方不能事后抵赖说「我没发过」。
签名流程是这样的:
- 签名方:先对数据做哈希,得到摘要。然后用私钥对摘要加密,生成签名。最后把「数据 + 签名」一起发出去。
- 验签方:收到后,用公钥解密签名,得到摘要A。同时自己对数据做哈希,得到摘要B。如果A == B,签名验证通过。
⚠️ 我曾经踩过的坑:
有一次,我们做OTA升级,发现某台车总是验签失败。查了半天,发现是车机端的时钟不准,导致证书有效期判断出错。嗯,这里要注意:数字签名依赖于证书体系,而证书是有有效期的。如果设备时间不对,签名验证就会失败。
在OTA升级中,数字签名是最后一道防线。服务器用私钥给固件包签名,车机用预置的公钥验签。只有验签通过,才允许刷写固件。这样,就算攻击者伪造了固件包,没有私钥,他也过不了验签这一关。
2.5 小结:它们是怎么配合的?
讲到这里,你可能已经发现了,对称加密、非对称加密、哈希函数、数字签名,它们不是孤立的,而是协同作战的。
我画个简单的配合流程:
- 服务器生成一个随机的AES密钥(对称密钥)。
- 服务器用设备的公钥(非对称)加密这个AES密钥。
- 服务器用AES密钥加密固件包。
- 服务器对固件包做哈希,然后用私钥签名。
- 车机收到后,先用私钥解密得到AES密钥。
- 用AES密钥解密固件包。
- 用公钥验签,确认固件包完整且来源可信。
你看,每一步都有它的作用。少了任何一个环节,安全链条就断了。
💡 给新手的建议:
刚开始接触这些概念时,别急着背算法细节。先理解它们各自解决什么问题:对称加密解决「快」,非对称加密解决「安全分发」,哈希解决「完整性」,数字签名解决「真实性」。把逻辑理清了,后面学证书管理就轻松多了。
好了,这一讲就到这里。下一讲,我们聊聊「证书与PKI体系」,看看这些钥匙和锁是怎么被组织起来,形成一个可信的生态的。