密码学基础回顾:对称加密与非对称加密、哈希函数、数字签名原理

说实话,每次带新人做安全更新分发项目,我都要先花半天时间跟他们捋一遍密码学基础。不是他们基础差,而是这部分知识太容易被忽略——大家总觉得“加密嘛,调个库就行了”。但真到了签名验证环节出问题,你连日志都看不懂。

这一章,我们就来快速过一遍密码学里最核心的四个概念。我会结合自己踩过的坑来讲,保证你听完就能跟实际场景对上号。

对称加密:简单但有个致命问题

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

常见的算法有 AES、DES、3DES。现在业界基本只用 AES,尤其是 AES-256,安全性足够,性能也还行。

核心特点:

  • 加解密速度快,适合大数据量
  • 密钥长度相对较短(128/192/256 位)
  • 最大的问题:密钥怎么安全地传给对方?

我在项目中遇到过一件事:一个 IoT 设备固件更新,团队用了 AES 加密固件包,密钥硬编码在代码里。结果固件被逆向,密钥直接暴露,整个更新机制形同虚设。嗯,这就是对称加密的典型死穴——密钥分发。

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

非对称加密就聪明多了。它用一对密钥:公钥和私钥。公钥可以公开,私钥自己藏好。用公钥加密的数据,只有对应的私钥能解开;反过来,用私钥签名的数据,公钥可以验证。

RSA 是最经典的,但现在我建议新项目优先考虑 ECC(椭圆曲线密码学),同样的安全强度下,ECC 的密钥更短、计算更快。

特性 对称加密 非对称加密
密钥数量 1 个 2 个(公钥 + 私钥)
加解密速度 快 慢(慢 100-1000 倍)
密钥分发 困难 公钥可公开
典型算法 AES, ChaCha20 RSA, ECDSA, Ed25519
主要用途 数据加密 密钥交换、数字签名

注意:非对称加密虽然解决了密钥分发问题,但性能太差。实际项目中,我们通常用非对称加密来传递对称密钥,然后用对称加密来加密实际数据。这叫“混合加密”,HTTPS 就是这么干的。

哈希函数:数据的“指纹”

哈希函数能把任意长度的数据,压缩成一个固定长度的摘要。而且这个操作是单向的——你没法从摘要反推出原始数据。

好的哈希函数要满足几个条件:

  • 抗碰撞性:很难找到两个不同的输入,产生相同的输出
  • 单向性:从输出反推输入,计算上不可行
  • 雪崩效应:输入改一个比特,输出大变样

常用的哈希算法有 SHA-256、SHA-3。MD5 和 SHA-1 已经不安全了,千万别再用。

我的习惯:在固件更新场景里,我通常先用 SHA-256 计算固件包的哈希值,然后对这个哈希值做签名。这样既保证了完整性,又避免了直接对大文件做非对称签名带来的性能开销。

数字签名:完整性的终极保障

数字签名解决的是三个问题:

  1. 身份认证:数据确实来自声称的发送方
  2. 完整性:数据在传输中没有被篡改
  3. 不可否认性:发送方不能事后抵赖

签名过程其实很简单:

  • 发送方用哈希函数计算数据的摘要
  • 用私钥对摘要进行加密(这就是签名)
  • 把原始数据和签名一起发给接收方
  • 接收方用公钥解密签名,得到摘要 A
  • 接收方自己计算原始数据的摘要 B
  • 如果 A == B,签名验证通过

我曾经在一个车机 OTA 项目里遇到过签名验证失败的 Bug。排查了两天,最后发现是签名时用的哈希算法是 SHA-256,但验证端默认配置了 SHA-1。两边算法不匹配,签名自然通不过。从那以后,我要求所有项目的签名算法配置必须显式声明,不能依赖默认值。

知识体系总览

下面这张图把本章的核心逻辑串起来了。你可以看到对称加密、非对称加密、哈希函数和数字签名之间的关系,以及它们在安全更新场景中的位置。

密码学基础 · 知识体系 对称加密 AES / ChaCha20 加解密用同一密钥 速度快,密钥分发难 非对称加密 RSA / ECDSA / Ed25519 公钥加密,私钥解密 速度慢,密钥分发易 哈希函数 SHA-256 / SHA-3 单向、抗碰撞 数据完整性校验 混合加密(实际项目常用) 非对称加密传递对称密钥 → 对称加密加密实际数据 数字签名 身份认证 + 完整性 + 不可否认性 哈希摘要 → 私钥签名 → 公钥验证 💡 安全更新场景: 固件包 → SHA-256 摘要 → 私钥签名 → 分发签名+固件 → 设备端公钥验证签名 → 确认固件完整且来源可信

实际项目中的选择建议

讲了这么多理论,最后给点实在的。如果你正在设计安全更新系统,我的建议是:

  • 签名算法:优先用 Ed25519,性能好、签名短、实现安全。RSA 虽然成熟,但密钥太长,签名也大,不适合 IoT 设备。
  • 哈希算法:SHA-256 是底线,别用更弱的。SHA-3 也可以,但生态不如 SHA-256 成熟。
  • 对称加密:固件包本身如果不需要保密,可以不加密,只签名。如果需要保密,用 AES-256-GCM,自带认证加密,省事。
  • 密钥管理:私钥必须放在硬件安全模块(HSM)或安全飞地(Secure Enclave)里。别学我前面说的那个团队,把私钥放代码里。

曾经踩过的坑:有一次我图省事,直接用 RSA 签名整个 500MB 的固件包。结果签名过程花了 40 秒,设备端验证又花了 30 秒。用户升级一次固件要等一分钟。后来改成先哈希再签名,整个过程缩短到 2 秒。记住:永远不要对大数据直接做非对称操作。

好了,密码学基础就回顾到这里。这些概念是后续所有安全机制的地基,理解透了,后面讲签名链、证书管理、分发协议的时候,你才能跟得上节奏。