密码学基础(一):对称加密与非对称加密的区别,哈希函数的特性
各位同学,咱们今天聊聊密码学基础。别一听「密码学」就觉得高深莫测,其实在嵌入式 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 升级中,这三者不是孤立的。我画了张图,帮你理清关系:
流程其实很简单:
- 发布端计算固件哈希,用私钥对哈希签名
- 将固件、签名、哈希一起打包发送
- 设备端用预置的公钥验签,确认签名合法
- 再计算固件哈希,与收到的哈希比对
- 全部通过,才执行升级
关键点:签名验证保证了固件来源可信(是谁发的),哈希校验保证了固件内容完整(有没有被改)。两者缺一不可。
我个人习惯把公钥烧死在设备的只读存储区,比如 OTP(一次性可编程)区域。这样即使固件被破解,攻击者也改不了公钥。嗯,这里要注意:公钥虽然公开,但必须保证它的真实性。设备里存的公钥,必须是厂商的合法公钥。