1、密码学基础:对称加密与非对称加密的区别、哈希函数的作用、加盐哈希的概念
好,咱们正式开始。第一章不讲代码,不讲硬件,先把密码学里最核心的三个概念掰扯清楚。
你想想看,在受限设备上做密码实现,最怕什么?怕选错算法,怕用错场景。我见过太多项目,芯片选型时没考虑加密开销,结果跑起来卡成幻灯片。所以这一章,咱们把地基打牢。
1.1 对称加密:一把钥匙开一把锁
对称加密,说白了就是加密和解密用同一把密钥。你拿它锁门,也拿它开门。
最常见的算法有 AES、DES、SM4。在嵌入式世界里,AES 是绝对的主流。为什么?因为它硬件加速支持好,很多 MCU 自带 AES 引擎,跑起来几乎不占 CPU。
核心特点:
- 加密速度快,适合大数据量
- 密钥分发困难——你得想办法把密钥安全地交给对方
- 密钥长度通常 128/192/256 位
我在项目中遇到过一件事:有个同事用 AES-256 加密传感器数据,结果发现 MCU 算力不够,每秒钟只能处理 200 字节。后来换成硬件 AES 引擎,速度直接飙到 2MB/s。嗯,选对实现方式很重要。
1.2 非对称加密:公钥加密,私钥解密
非对称加密就有点意思了。它有两把钥匙:公钥公开,私钥自己藏好。你用我的公钥加密,只有我能用私钥解开。
常见的算法有 RSA、ECC、SM2。在受限设备上,ECC(椭圆曲线密码)比 RSA 更受欢迎——同样的安全强度,ECC 的密钥更短,计算量更小。
| 特性 | 对称加密 | 非对称加密 |
|---|---|---|
| 密钥数量 | 1 个 | 2 个(公钥 + 私钥) |
| 速度 | 快(硬件加速可达 GB/s) | 慢(通常慢 100-1000 倍) |
| 典型用途 | 批量数据加密 | 密钥交换、数字签名 |
| 嵌入式开销 | 低 | 高(尤其 RSA) |
我个人习惯的做法是:用非对称加密来传递对称密钥,然后用对称加密来加密实际数据。这叫「混合加密」,既安全又高效。
避坑指南:我曾经见过一个产品,直接用 RSA 加密每一条传感器数据。结果电池两天就耗光了。非对称加密不是这么用的——它适合小数据量、低频次的操作,比如固件签名验证、密钥协商。
1.3 哈希函数:不可逆的指纹
哈希函数,你可以把它理解成「数字指纹」。输入任意长度的数据,输出固定长度的哈希值。而且,哪怕输入只改一个比特,输出的哈希值也会面目全非。
常见的哈希算法有 SHA-256、SHA-3、SM3。在嵌入式里,SHA-256 是最通用的选择。
哈希函数有三个核心特性:
- 单向性:从哈希值反推原始数据,理论上不可能
- 抗碰撞性:很难找到两个不同的输入,产生相同的哈希值
- 雪崩效应:输入微小变化,输出剧烈变化
实际用途:哈希函数在嵌入式里最常见的三个场景——固件完整性校验、密码存储、消息认证码(HMAC)。我建议你至少把 SHA-256 的接口调通,后面章节会反复用到。
1.4 加盐哈希:别让密码裸奔
直接存密码的哈希值,够安全吗?不够。为什么?因为攻击者可以提前算好常见密码的哈希值,做成「彩虹表」。你存的是哈希,人家一查表就还原了。
加盐,就是在密码后面拼接一段随机字符串,然后再算哈希。每个用户的盐都不一样,彩虹表就失效了。
// 伪代码示例:加盐哈希
salt = random_bytes(16) // 生成 16 字节随机盐
hash = SHA256(password + salt) // 密码 + 盐,一起哈希
store(username, salt, hash) // 存储用户名、盐、哈希值
// 验证时:
input_hash = SHA256(input_password + stored_salt)
if input_hash == stored_hash:
accept()
else:
reject()
我曾经在一个 IoT 项目里发现,厂商直接把用户密码的 MD5 值存到服务器上。结果数据库泄露,几万个设备被远程控制。嗯,加盐这件事,真的不能省。
加盐的最佳实践:
- 盐的长度至少 16 字节
- 每个用户使用独立的随机盐
- 使用慢哈希算法(如 bcrypt、PBKDF2、Argon2)替代简单哈希
- 盐和哈希值一起存储,不要分开
1.5 知识体系总览
下面这张图,把本章的核心概念串起来了。你可以把它当作一个思维导图,后面每学一章,都可以往这个框架里填东西。
这张图里,对称加密和非对称加密是「加密」的两条腿,哈希函数是「完整性校验」的基石,加盐哈希则是密码存储的标配。后面所有章节,都会围绕这三个核心展开。
给初学者的建议:别急着把所有算法都学透。先把 AES-128、SHA-256、ECC 这三个接口调通,跑几个测试向量,你就已经超过 80% 的嵌入式工程师了。剩下的,遇到具体场景再查不迟。