密码学基础(一):对称加密与非对称加密的区别,哈希函数的特性

各位同学,咱们今天聊聊密码学基础。别一听「密码学」就觉得高深莫测,其实在嵌入式 OTA 升级里,它就是个工具。我做了这么多年固件安全,说白了,加密和哈希就是保护你固件的两把锁。

先问个问题:你辛辛苦苦写完代码,编译成固件,通过网络发给设备。如果中间被人篡改了,设备跑起来会怎样?轻则死机,重则被植入后门。嗯,这就是我们要解决的问题。

对称加密:一把钥匙开一把锁

对称加密,顾名思义,加密和解密用的是同一把密钥。就像你家的门锁,用同一把钥匙锁门和开门。

常见的对称加密算法有 AES、DES、SM4(国密)。在嵌入式领域,AES-128 用得最多。为什么?因为硬件加速器几乎标配,速度快,功耗低。

核心特点:

  • 加解密速度快,适合大数据量
  • 密钥长度相对较短(128/256 位)
  • 最大问题:密钥如何安全分发?

我在项目中遇到过一件事:有个同事把 AES 密钥硬编码在固件里,觉得没人能读到 Flash。结果产品被破解后,密钥直接暴露。你想想看,这等于把家门钥匙贴在门上。

避坑指南:我曾经见过一个团队,用对称加密给固件加密,但密钥通过明文传输。这相当于给保险箱上了锁,却把钥匙放在保险箱旁边。对称加密的密钥分发,必须依赖安全通道,比如后面要讲的非对称加密。

非对称加密:公钥私钥,各司其职

非对称加密就聪明多了。它有一对密钥:公钥和私钥。公钥可以公开,私钥必须保密。

用公钥加密的数据,只能用私钥解密。反过来,用私钥签名的数据,可以用公钥验证。这个特性,简直是 OTA 升级的福音。

常见的算法有 RSA、ECC(椭圆曲线)、SM2(国密)。在资源受限的嵌入式设备上,ECC 比 RSA 更受欢迎。为什么?同样的安全强度,ECC 的密钥更短,计算更快。

特性 对称加密 非对称加密
密钥数量 1 个 2 个(公钥 + 私钥)
速度 快(硬件加速) 慢(数学运算复杂)
密钥分发 困难 公钥可公开
典型用途 数据加密 签名验证、密钥交换
嵌入式常用 AES-128 ECC-256 / RSA-2048

我个人的习惯是:用非对称加密做签名验证,用对称加密做数据加密。两者结合,取长补短。

哈希函数:数据的指纹

哈希函数,又叫散列函数。它能把任意长度的数据,变成固定长度的摘要。这个摘要,就像数据的指纹。

好的哈希函数有三个特性:

  • 单向性:从摘要反推原始数据,几乎不可能
  • 抗碰撞性:很难找到两个不同数据,产生相同摘要
  • 雪崩效应:输入改一个比特,输出大变样

常见的哈希算法有 SHA-256、SHA-3、SM3(国密)。在 OTA 升级中,哈希函数主要用来做完整性校验。

实用技巧:我建议你在固件发布时,先计算整个固件的 SHA-256 哈希值。设备下载完成后,再算一遍。两个值一比对,就知道固件有没有被篡改。简单、高效、可靠。

举个例子:

# 发布端计算哈希
固件文件 → SHA-256 → a3f5b2c8d1e9...

# 设备端计算哈希
下载的固件 → SHA-256 → a3f5b2c8d1e9...

# 比对结果一致 → 固件完整

哈希函数还有个妙用:密码存储。千万别明文存密码,存哈希值。用户登录时,算一遍哈希再比对。这样即使数据库泄露,攻击者也拿不到原始密码。

三者如何配合?

在 OTA 升级中,这三者不是孤立的。我画了张图,帮你理清关系:

OTA 升级中的密码学组合 发布端(服务器) 固件文件 SHA-256 哈希 私钥签名 固件 + 签名 + 哈希 网络传输 设备端(接收) 接收固件 + 签名 公钥验签 计算哈希比对 通过 → 执行升级 公钥预置

流程其实很简单:

  1. 发布端计算固件哈希,用私钥对哈希签名
  2. 将固件、签名、哈希一起打包发送
  3. 设备端用预置的公钥验签,确认签名合法
  4. 再计算固件哈希,与收到的哈希比对
  5. 全部通过,才执行升级

关键点:签名验证保证了固件来源可信(是谁发的),哈希校验保证了固件内容完整(有没有被改)。两者缺一不可。

我个人习惯把公钥烧死在设备的只读存储区,比如 OTP(一次性可编程)区域。这样即使固件被破解,攻击者也改不了公钥。嗯,这里要注意:公钥虽然公开,但必须保证它的真实性。设备里存的公钥,必须是厂商的合法公钥。