3、密码学基础:对称加密(AES)、非对称加密(RSA/ECC)、哈希函数(SHA256)
好,咱们进入正题。密码学,听起来很高大上,对吧?其实在嵌入式世界里,尤其是可穿戴设备里,它就是个「看门狗」——保护你的数据不被别人偷走或篡改。我个人习惯把密码学比作「锁和钥匙」的组合,只不过这里的锁和钥匙都是数学公式。
今天咱们聊三个核心工具:AES、RSA/ECC 和 SHA256。你想想看,一个可穿戴设备从采集心率到上传云端,这三样东西基本都会用到。嗯,咱们一个一个来。
3.1 对称加密:AES
对称加密,说白了就是「一把钥匙开一把锁」。加密和解密用的是同一个密钥。速度快,适合在资源受限的MCU上跑。
AES(Advanced Encryption Standard)是目前最主流的对称加密算法。它支持128、192、256位密钥长度。我个人建议,在可穿戴设备里至少用AES-128,如果芯片算力够,直接上AES-256。
核心要点:AES 是分组加密,每次处理16字节(128位)的数据块。如果数据不够16字节,需要做填充(Padding)。
我在项目中遇到过一个问题:某款手环在传输心率数据时,用了AES-ECB模式。结果呢?加密后的数据块之间没有关联,攻击者可以通过重放攻击伪造数据包。后来我改成了AES-CBC模式,加了个随机IV(初始化向量),问题就解决了。
来看一个简单的代码示例,用C语言实现AES-128加密(伪代码风格):
// AES-128 CBC 加密示例
#include "aes.h"
uint8_t key[16] = {0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c};
uint8_t iv[16] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
uint8_t plaintext[32] = "Hello, Wearable!";
uint8_t ciphertext[32];
AES_CBC_encrypt(plaintext, ciphertext, key, iv, sizeof(plaintext));
避坑指南:我曾经在STM32上直接用了软件实现的AES,结果发现加密一次要几十毫秒,严重影响实时性。后来换成了硬件AES加速器(如果芯片支持),速度提升了10倍以上。所以,选型时一定要看芯片有没有硬件加密引擎。
3.2 非对称加密:RSA 与 ECC
非对称加密,就是「两把钥匙」——公钥加密,私钥解密。公钥可以公开,私钥自己藏好。它解决了对称加密中密钥分发的难题。
RSA 是最经典的非对称算法,基于大整数分解的数学难题。但它的密钥长度通常需要2048位以上才安全,这在可穿戴设备上是个负担——计算慢、占用Flash大。
ECC(椭圆曲线密码学) 就友好多了。它基于椭圆曲线离散对数难题,用更短的密钥就能达到同等安全强度。比如,ECC-256 的安全性与 RSA-3072 相当,但密钥长度只有后者的十分之一。
我个人更倾向于在可穿戴设备里用ECC。为什么?你想想看,一个手环的Flash可能只有256KB,你还要放固件、放算法、放数据。RSA的密钥存储和运算开销太大了。
| 算法 | 密钥长度(安全等级) | 计算开销 | 适用场景 |
|---|---|---|---|
| RSA | 2048位(112位安全) | 高 | 密钥交换、数字签名 |
| ECC | 256位(128位安全) | 低 | 可穿戴设备、IoT |
注意:非对称加密速度慢,不适合加密大量数据。实际项目中,我们通常用「混合加密」:用ECC或RSA交换对称密钥,然后用AES加密实际数据。我在做一款智能手表时,就是这么干的——先用ECC握手,再用AES-CBC加密传感器数据。
3.3 哈希函数:SHA256
哈希函数,说白了就是「数字指纹」。它能把任意长度的数据,压缩成一个固定长度的摘要(比如256位)。而且,它是单向的——从摘要反推原始数据,几乎不可能。
SHA256 是SHA-2家族的一员,输出256位(32字节)的哈希值。在可穿戴设备里,它常用于:
- 数据完整性校验:确保固件或数据在传输过程中没被篡改。
- 密码存储:不存明文密码,只存哈希值。
- 数字签名:先对消息做哈希,再对哈希值签名。
我记得有一次,一个客户反馈说手环的固件升级总是失败。排查了半天,发现是固件包的SHA256校验值在传输过程中被截断了。嗯,这里要注意:哈希值必须完整传输,否则校验会失败。
来看一个SHA256的简单用法(伪代码):
// SHA256 哈希计算示例
#include "sha256.h"
uint8_t data[] = "Firmware v2.1";
uint8_t hash[32];
SHA256_calculate(data, sizeof(data), hash);
// hash 数组里就是32字节的摘要值
个人经验:在低功耗场景下,SHA256的计算功耗其实不高。以Cortex-M4内核为例,计算一次SHA256大约消耗几毫秒,电流也就几毫安。所以,别怕用哈希函数,它比非对称加密省电多了。
3.4 三者如何配合?
在实际的可穿戴设备中,这三个算法通常是「打配合」的。我给你画个简单的流程:
- 设备注册时:用ECC生成密钥对,公钥上传到服务器,私钥留在设备安全存储区。
- 数据传输时:用ECC或RSA交换一个临时AES密钥(会话密钥)。
- 数据加密时:用AES-CBC加密传感器数据(如心率、血氧)。
- 数据校验时:对加密后的数据包做SHA256哈希,确保完整性。
- 固件升级时:先校验固件包的SHA256值,再用ECC签名验证固件来源。
你看,一环扣一环。少了任何一个,都可能被攻击者钻空子。我曾经见过一个产品,只用了AES加密,没做哈希校验,结果攻击者篡改了加密数据包,导致设备死机。嗯,教训深刻。
总结一下:
- AES:速度快,适合加密大量数据。推荐CBC或GCM模式。
- ECC:密钥短,适合资源受限设备。推荐用于密钥交换和签名。
- SHA256:轻量级,适合完整性校验和密码存储。
记住,密码学不是「用了就安全」,而是「用对了才安全」。选型时,一定要结合芯片算力、功耗、Flash大小来权衡。
好,这一章就到这里。下一章咱们聊聊「安全启动与固件签名」,到时候会用到今天讲的哈希和签名知识。有什么问题,欢迎随时交流。