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

各位同学,咱们今天聊点硬核的。密码学,说白了就是固件安全的基石。你想想看,没有密码学,你的固件签名就是一张废纸,更新机制就是个筛子。我在嵌入式安全这行摸爬滚打十几年,见过太多因为密码学基础不牢,导致整个安全体系崩塌的案例。

这一章,咱们就聚焦三个核心概念:对称加密、非对称加密,还有哈希函数。别觉得它们枯燥,搞懂了这些,你才能理解后面固件签名验证到底在防什么。

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

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

它的优点是快,非常快。在资源受限的嵌入式设备上,比如一个简单的MCU,对称加密几乎是唯一的选择。我早期做的一个智能电表项目,用的就是AES-128,跑起来毫无压力。

但缺点也很致命——密钥分发。你怎么把密钥安全地交给对方?如果密钥在传输过程中被截获,那加密就形同虚设。这就像你把家门钥匙寄给朋友,结果快递丢了,你家就危险了。

核心要点:对称加密适合大量数据的加密,但密钥管理是最大的痛点。常见算法有AES、DES、SM4(国密)。

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

非对称加密就聪明多了。它有一对密钥:公钥和私钥。公钥可以公开,私钥必须保密。用公钥加密的数据,只能用私钥解密;反之,用私钥签名的数据,只能用公钥验证。

这解决了密钥分发的难题。你想想看,在固件更新场景中,设备端只需要预置一个公钥,服务器用私钥对固件签名。这样,即使公钥被所有人知道,也无法伪造签名,因为私钥在服务器手里。

不过,非对称加密的代价是性能。它比对称加密慢好几个数量级。所以实际应用中,我们通常用非对称加密来加密一个会话密钥,然后用这个会话密钥去加密后续的通信数据。这叫混合加密。

我的经验:在固件签名验证中,我们只用非对称加密的签名功能,而不是加密功能。签名保证的是完整性和真实性,而不是机密性。这一点很多新手会搞混。

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

哈希函数,它能把任意长度的数据,压缩成一个固定长度的摘要。这个摘要就像数据的“指纹”,独一无二。

哈希函数有两个核心特性,你必须刻在脑子里:

  • 碰撞阻力:很难找到两个不同的输入,产生相同的哈希值。如果发生了碰撞,那这个哈希函数就废了。我记得前几年SHA-1被成功碰撞,整个行业都震动了,大家纷纷迁移到SHA-256。
  • 雪崩效应:输入数据哪怕只改变一个比特,输出的哈希值也会发生天翻地覆的变化。这保证了哈希值的随机性和不可预测性。

在固件更新中,哈希函数的作用是什么?我们会对固件镜像计算一个哈希值,然后用私钥对这个哈希值签名。设备端收到固件后,先计算本地哈希,再用公钥验证签名。这样,只要固件被篡改,哈希值就会变,签名验证就会失败。

避坑指南:我曾经遇到过一个项目,工程师为了省事,直接用MD5做固件哈希。结果呢?攻击者轻松构造了一个碰撞固件,绕过了签名验证。记住,MD5和SHA-1已经不安全了,现在至少要用SHA-256。

4. 一张图看懂三者关系

下面这张SVG图,帮你理清对称加密、非对称加密和哈希函数在固件更新中的协作关系。

固件更新中的密码学协作关系 固件更新中的密码学协作关系 对称加密 (AES) 非对称加密 (RSA/ECC) 哈希函数 (SHA-256) 加密固件内容 速度快,适合大量数据 密钥分发是痛点 签名固件哈希值 公钥私钥分离 性能较慢 生成固件摘要 碰撞阻力 + 雪崩效应 不可逆,防篡改 固件签名与验证流程 ① 计算固件哈希 ② 用私钥签名哈希 ③ 打包固件+签名 ④ 设备接收固件 ⑤ 计算本地哈希 ⑥ 用公钥验证签名 哈希匹配 + 签名有效 → 固件可信 注:实际项目中,对称加密用于加密固件传输,非对称加密用于签名验证,哈希函数用于完整性校验

5. 三种技术的对比

为了让你更直观地理解它们的区别,我整理了一个表格:

特性 对称加密 非对称加密 哈希函数
密钥数量 1个(共享密钥) 2个(公钥+私钥) 无密钥
速度 快 慢 极快
主要用途 数据加密 签名/密钥交换 完整性校验
可逆性 可逆 可逆(有密钥) 不可逆
典型算法 AES, DES, SM4 RSA, ECC, SM2 SHA-256, SM3
固件场景 加密固件传输 固件签名验证 固件完整性校验

6. 我的建议

搞嵌入式固件安全,你不需要成为密码学专家,但必须理解这些基础概念。我个人习惯是:

  • 能用哈希解决的,绝不用加密。比如固件完整性校验,哈希就够了,别画蛇添足。
  • 签名验证必须用非对称加密。这是固件防篡改的基石,别想着用对称加密替代。
  • 密钥管理是重中之重。公钥可以公开,但私钥必须锁在保险柜里。我见过太多因为私钥泄露导致整个产品线被攻破的案例。

嗯,这一章的内容就到这里。记住,密码学不是魔法,它是工程。理解了这些基础,你才能在后面对抗那些试图篡改你固件的攻击者。