密码学基础(上):对称加密与非对称加密、哈希函数、数字签名

好,咱们开始聊密码学。说实话,很多做OTA的工程师一听到「密码学」三个字就头大,觉得那是数学博士才该碰的东西。但我跟你说,搞OTA安全,你不需要成为密码学家,但必须懂这些基础工具怎么用、用在哪儿。

我见过太多项目,密钥管理一塌糊涂,最后整个升级链路被人从中间捅了个窟窿。嗯,咱们今天就把这几个核心概念掰开揉碎了讲清楚。

一、对称加密:简单粗暴,但有个大麻烦

对称加密,说白了就是加密和解密用同一把钥匙。你想想看,就像你家大门,用一把钥匙锁上,也用同一把钥匙打开。

常见的对称加密算法有:

  • AES(Advanced Encryption Standard)—— 目前最主流,我项目里90%的场景都用它
  • DES —— 太老了,别用了,56位密钥分分钟被暴力破解
  • SM4 —— 国密标准,国内项目必须考虑

核心要点:对称加密速度快,适合加密大量数据。但密钥分发是个死穴——你怎么把密钥安全地交给对方?

我在一个车厂项目里遇到过这种情况:OTA升级包用AES-256加密,但密钥直接硬编码在MCU的固件里。结果呢?有人用JTAG把固件读出来,密钥直接暴露。你说这加密还有啥意义?

⚠️ 避坑指南:我曾经见过一个团队,对称密钥通过网络明文传输。这相当于你把家门钥匙挂在门外,然后跟小偷说「别进来哦」。密钥分发必须用安全通道,比如后面要讲的非对称加密。

二、非对称加密:解决密钥分发难题

非对称加密就聪明多了。它有一对密钥:公钥和私钥。公钥可以公开,私钥自己藏好。

怎么用呢?我给你举个例子:

  • 你要给我发密文,用我的公钥加密
  • 我收到后,用我的私钥解密
  • 别人拿到公钥也解不开,因为没有私钥

常见的非对称加密算法:

算法 密钥长度 特点 我的建议
RSA 2048位起 最成熟,但慢 签名场景首选
ECC 256位 同等安全强度下密钥更短 嵌入式设备首选
SM2 256位 国密标准 国内项目必须

你想想看,非对称加密虽然慢,但它解决了密钥分发这个老大难问题。实际项目中,我们通常这样搭配:

// 混合加密的典型流程
1. 客户端生成随机对称密钥(Session Key)
2. 用服务器的公钥加密这个对称密钥
3. 服务器用私钥解密,得到对称密钥
4. 后续通信全部用对称加密

// 这样既解决了密钥分发,又保证了速度

💡 个人经验:我建议在OTA场景中,用ECC做密钥交换,用AES做数据加密。ECC的密钥短,适合资源受限的嵌入式设备,AES速度快,适合加密大容量的升级包。

三、哈希函数:数据的「指纹」

哈希函数,说白了就是把任意长度的数据,压缩成一个固定长度的摘要。这个摘要就像人的指纹,独一无二。

哈希函数有几个关键特性:

  • 单向性:从哈希值无法反推出原始数据
  • 抗碰撞性:很难找到两个不同的输入,产生相同的哈希值
  • 雪崩效应:输入改一个比特,输出完全变样

常用的哈希算法:

  • SHA-256 —— 目前最安全,我项目里都用它
  • MD5 —— 别用了,已经被攻破,碰撞攻击很容易
  • SM3 —— 国密哈希标准

哈希在OTA中的典型用途:下载完升级包后,计算它的哈希值,跟服务器下发的哈希值对比。如果一致,说明文件没被篡改。这就是完整性校验。

我曾经遇到一个案例:某厂商OTA升级包只做了哈希校验,但哈希值本身是通过HTTP明文传输的。攻击者截获升级包,替换成恶意固件,同时把哈希值也改了。嗯,这就是典型的「哈希校验形同虚设」。

⚠️ 注意:哈希值必须通过安全通道获取,或者用数字签名保护起来。否则哈希校验就是个摆设。

四、数字签名:身份认证 + 完整性校验

数字签名,就是把哈希函数和非对称加密结合起来。它解决两个问题:

  1. 身份认证:确认数据确实来自声称的发送方
  2. 完整性校验:确认数据没有被篡改

签名过程是这样的:

// 签名方(服务器)
1. 计算数据的哈希值
2. 用私钥加密哈希值 → 得到签名
3. 发送「数据 + 签名」给接收方

// 验证方(设备)
1. 收到「数据 + 签名」
2. 用公钥解密签名 → 得到哈希值A
3. 自己计算数据的哈希值 → 得到哈希值B
4. 对比A和B,一致则验证通过

你想想看,这里的关键是什么?公钥必须可信。如果公钥被替换了,那整个签名体系就崩了。

💡 我的做法:在OTA系统中,我会把根公钥烧录在芯片的一次性可编程(OTP)区域。这样攻击者就算拿到固件,也改不了公钥。这是硬件级别的信任根。

我记得有个项目,他们用RSA-2048做签名,但公钥存储在外部Flash里。结果有人通过SPI接口把公钥换成了自己的,然后用自己的私钥签名恶意固件。设备毫无防备地就升级了。你说这锅该谁背?

五、把这些串起来:OTA升级的安全链路

好了,咱们把今天讲的几个概念串起来,看看一个完整的OTA安全升级链路长什么样:

  1. 镜像签名:服务器用私钥对升级包做数字签名
  2. 镜像加密:用对称密钥加密升级包(可选,取决于你的安全需求)
  3. 密钥交换:用非对称加密传输对称密钥
  4. 设备验证:用公钥验证签名,用哈希校验完整性
  5. 解密安装:用对称密钥解密,然后刷写固件

核心原则:私钥永远不出设备,公钥可以公开但必须防篡改。哈希保证完整性,签名保证真实性,加密保证机密性。三者缺一不可。

我个人习惯,在设计OTA安全体系时,会先画一张数据流图,标清楚每个环节用了什么密码学工具,密钥在哪里生成、哪里存储、哪里使用。这张图画清楚了,后面实现就不容易出大错。

嗯,今天先聊到这儿。下一节咱们深入讲讲密钥的生命周期管理——怎么生成、怎么存储、怎么轮换、怎么销毁。这些才是真正让工程师头疼的地方。