密码学基础(上):对称加密与非对称加密、哈希函数、数字签名原理
各位同学,欢迎来到安全启动课程的第二讲。今天我们要啃的这块骨头,是整个安全体系的基石——密码学基础。说实话,密码学这玩意儿,刚接触时容易让人头大。但别担心,我会用最接地气的方式,把对称加密、非对称加密、哈希函数和数字签名这几个核心概念讲透。
我做了这么多年嵌入式安全,见过太多因为密码学基础不牢而翻车的项目。有一次,一个同事把AES的密钥硬编码在固件里,还觉得没人能读出来……嗯,结果你懂的。所以这一章,咱们不光要懂原理,更要明白实战中怎么用、有什么坑。
本章核心脉络:密码学不是孤立的技术,它是安全启动的骨架。对称加密管速度,非对称加密管密钥分发,哈希函数管完整性,数字签名管认证。四者缺一不可。
2.1 对称加密:一把钥匙开一把锁
对称加密,说白了就是加密和解密用同一把钥匙。你想想看,就像你家大门,用一把钥匙锁上,也用同一把钥匙打开。简单直接,效率高。
常见的对称加密算法有AES、DES、3DES。现在DES基本被淘汰了,3DES也处于退休边缘。AES是绝对的主流,密钥长度支持128位、192位、256位。我个人习惯,在嵌入式场景下至少用AES-128,如果安全等级要求高,直接上AES-256。
| 算法 | 密钥长度 | 状态 | 典型应用 |
|---|---|---|---|
| AES | 128/192/256 bit | 推荐 | 固件加密、通信加密 |
| DES | 56 bit | 已淘汰 | 历史遗留系统 |
| 3DES | 112/168 bit | 不推荐 | 老旧兼容 |
对称加密最大的优势是快。在嵌入式设备上,AES硬件加速器几乎是标配,加解密一个128位的数据块只需要几个时钟周期。但它的致命弱点也在这里——密钥怎么安全地传给对方?
避坑指南:我曾经见过一个产品,用AES加密了固件,但密钥直接写在代码里。攻击者用JTAG读出Flash,密钥就暴露了。记住:密钥管理比加密算法本身更重要。
2.2 非对称加密:公钥私钥,各司其职
非对称加密解决了密钥分发的问题。它用一对密钥:公钥公开,私钥保密。公钥加密的数据只能用私钥解密,反过来,私钥签名的数据可以用公钥验证。
常见的算法有RSA、ECC(椭圆曲线密码学)。RSA基于大整数分解难题,ECC基于椭圆曲线离散对数问题。在同等安全强度下,ECC的密钥长度更短,计算量更小,特别适合资源受限的嵌入式设备。
| 算法 | 安全强度 | 密钥长度 | 嵌入式适用性 |
|---|---|---|---|
| RSA | 高 | 2048/4096 bit | 一般(计算量大) |
| ECC | 高 | 256/384 bit | 优秀(密钥短、快) |
非对称加密的缺点是慢。RSA-2048签名一次可能需要几毫秒,而AES加密同样数据量只需要微秒级。所以实际应用中,我们通常用非对称加密来传递对称密钥,然后用对称加密来加密实际数据。这叫混合加密,后面我们会详细讲。
实战经验:在安全启动中,我们通常把公钥烧录在芯片的一次性可编程(OTP)区域,私钥保存在服务器端。这样即使芯片被物理攻击,公钥被读出也无法伪造签名。
2.3 哈希函数:数据的指纹
哈希函数,你可以把它理解成数据的指纹。它能把任意长度的输入,压缩成固定长度的输出(比如256位)。而且,哪怕输入只改了一个比特,输出的哈希值也会面目全非。
好的哈希函数有三个特性:
- 单向性:从哈希值反推原始数据,几乎不可能。
- 抗碰撞性:找到两个不同输入产生相同哈希值,计算上不可行。
- 雪崩效应:输入微小变化,输出剧烈变化。
常用的哈希算法有SHA-1、SHA-256、SHA-3。SHA-1已经被证明不安全,现在最低要求是SHA-256。在安全启动中,哈希函数用来校验固件的完整性——计算固件的哈希值,和签名中的哈希值对比,就知道固件有没有被篡改。
核心要点:哈希函数不是加密!它没有密钥,也不可逆。它的作用是完整性校验,不是保密性。
2.4 数字签名:防伪与防抵赖
数字签名,就是把哈希函数和非对称加密结合起来。流程是这样的:
- 发送方对数据计算哈希值。
- 用私钥对哈希值加密,得到签名。
- 接收方用公钥解密签名,得到哈希值。
- 接收方自己计算数据的哈希值,对比两者是否一致。
如果一致,说明数据没有被篡改,而且确实来自私钥持有者。这就是数字签名的两个核心功能:完整性验证和身份认证。
在安全启动中,数字签名是灵魂。芯片上电后,先验证Bootloader的签名,Bootloader再验证操作系统内核的签名,层层验证,确保每一级代码都是可信的。
我曾经踩过的坑:有一次,我们用的签名算法是RSA-PKCS#1 v1.5,结果被攻击者利用填充预言机攻击破解了。后来全部换成RSA-PSS或者ECDSA。记住:算法实现和参数选择同样重要,别用过时的填充方案。
2.5 知识体系总览
下面这张图,把今天讲的核心概念串起来。你可以看到,对称加密、非对称加密、哈希函数、数字签名,它们各自负责什么,又是如何协同工作的。
2.6 实战中的组合拳
讲完理论,咱们看看实际项目中怎么用。以安全启动为例,流程大致是这样的:
- 固件签名(服务器端):计算固件的SHA-256哈希值,用私钥(比如ECDSA)对哈希值签名,把签名附加到固件末尾。
- 固件加密(可选):用AES-256加密固件内容,防止被逆向分析。AES密钥用接收方的公钥加密后传输。
- 固件验证(设备端):芯片上电,从OTP区域读取公钥,用公钥验证签名。如果签名有效,说明固件是官方发布的,没有被篡改。
- 解密执行:用私钥解密AES密钥,再用AES密钥解密固件,然后加载执行。
个人建议:在嵌入式设备上,优先使用硬件密码引擎。软件实现容易引入侧信道攻击,比如时序分析、功耗分析。硬件引擎通常有防护措施,能抵抗这些攻击。
2.7 常见误区与避坑
最后,我总结几个常见误区,都是我在项目中真实遇到过的:
- 误区一:认为哈希函数可以用于加密。不行!哈希是单向的,加密是可逆的,两者完全不同。
- 误区二:签名就是加密。不对!签名用私钥,加密用公钥。虽然数学运算类似,但用途和安全性要求不同。
- 误区三:密钥越长越安全。理论上没错,但实际要考虑性能。ECC-256已经达到RSA-3072的安全等级,在嵌入式设备上更实用。
- 误区四:算法公开就不安全。恰恰相反,公开算法经过全球密码学家检验,比隐藏算法安全得多。安全靠密钥,不靠算法保密。
我曾经犯过的错:早期一个项目,我用SHA-1做固件完整性校验,觉得够用了。后来Google公布了SHAttered碰撞攻击,我才意识到SHA-1已经不安全。连夜改成SHA-256,还好没出安全事故。从那以后,我所有新项目最低要求SHA-256。
好了,这一章的内容就到这里。密码学基础是安全启动的根基,理解透了,后面讲安全启动架构、信任链、密钥管理时,你才能游刃有余。记住:理论要扎实,实战要谨慎,坑都是前人踩出来的。