4、签名算法入门:对称加密与非对称加密、RSA算法原理、ECC算法简介、数字签名概念
好,咱们进入第四讲。这一章是理论课,但我会尽量讲得接地气一些。
做OTA升级,签名是核心中的核心。你想想看,如果升级包没有签名,那跟在大街上随便捡个U盘就往电脑里插有什么区别?我早年做物联网设备时,就见过有人直接把固件明文扔到服务器上,结果被中间人篡改,设备批量变砖。嗯,从那以后,我对签名这件事就特别较真。
4.1 对称加密 vs 非对称加密
先聊加密。加密这事儿,说白了就是给数据上锁。
对称加密,就像你用一把钥匙锁门,也用同一把钥匙开门。加密和解密用的是同一个密钥。典型算法有AES、DES、SM4。
- 优点:速度快,适合加密大量数据。
- 缺点:密钥怎么安全地传给对方?这是个死穴。
我在项目中遇到过一个问题:设备端和服务器都用AES加密通信,但密钥是硬编码在固件里的。结果有人反编译固件,直接把密钥扒出来了。你说这加密还有啥意义?
非对称加密,则是一对钥匙——公钥和私钥。公钥可以公开,私钥自己藏好。用公钥加密的数据,只有私钥能解开;反过来,用私钥签名的数据,公钥可以验证。
- 优点:解决了密钥分发问题。
- 缺点:慢,比对称加密慢几百倍。
所以实际工程中,往往是混合使用:用非对称加密来传递对称密钥,再用对称密钥加密实际数据。这叫"混合加密",我建议你在设计OTA方案时也这么干。
核心区别一句话总结:
对称加密——一把钥匙开一把锁。
非对称加密——一把锁配两把钥匙,一把公开,一把私藏。
4.2 RSA算法原理
RSA是目前最经典的非对称加密算法。名字来自三位发明者:Rivest、Shamir、Adleman。
它的数学原理其实不复杂,核心就一句话:大数分解很难。
具体流程是这样的:
- 选两个大质数 p 和 q,计算 n = p × q。
- 计算欧拉函数 φ(n) = (p-1)(q-1)。
- 选一个公钥指数 e,通常取 65537。
- 计算私钥 d,满足 e × d ≡ 1 (mod φ(n))。
公钥就是 (n, e),私钥就是 (n, d)。
加密时:c = m^e mod n(m是明文,c是密文)
解密时:m = c^d mod n
你可能会问:为什么公钥加密后只有私钥能解?因为要算出 d,你得知道 φ(n),而 φ(n) 需要知道 p 和 q。但 n 公开了,想从 n 反推出 p 和 q,就是大数分解问题。目前1024位以下的RSA已经被认为不安全了,我建议你用2048位或4096位。
避坑指南:
我曾经见过有人直接用OpenSSL生成RSA密钥对,但没注意随机数种子质量。结果生成的密钥有规律可循,被攻击者猜出来了。记住:随机数一定要用硬件真随机数发生器,别用伪随机。
4.3 ECC算法简介
ECC(椭圆曲线密码学)是RSA的替代方案。它用更短的密钥长度,提供同等级别的安全强度。
举个例子:
- RSA 2048位 ≈ ECC 224位
- RSA 3072位 ≈ ECC 256位
- RSA 15360位 ≈ ECC 512位
你看,ECC的密钥长度短得多。这对嵌入式设备来说太重要了——存储空间和计算资源都有限。
ECC的数学原理基于椭圆曲线上的离散对数问题。具体来说,就是给定椭圆曲线上的两个点 G 和 Q,很难找到整数 k 使得 Q = kG。这就是ECC的安全基础。
我个人的习惯是:在资源受限的MCU上,优先用ECC。比如STM32系列,硬件加速ECC运算,签名验证速度比RSA快很多。
注意:
ECC虽然好,但曲线选择要谨慎。不要自己随便定义曲线参数,直接用标准曲线,比如secp256r1(也叫P-256)或SM2国密曲线。我见过有人自己造曲线,结果有安全漏洞,被攻破了。
4.4 数字签名概念
好了,前面铺垫了这么多,终于到正题了——数字签名。
数字签名不是加密,它的目的是防篡改和防抵赖。
流程是这样的:
- 发送方对原始数据做哈希运算,得到摘要。
- 用私钥对摘要加密,得到签名。
- 把原始数据和签名一起发给接收方。
- 接收方用公钥解密签名,得到摘要A。
- 接收方对原始数据做同样的哈希运算,得到摘要B。
- 比较A和B,如果一致,说明数据没被篡改,且确实是发送方签的。
你想想看,为什么先哈希再签名?因为非对称加密慢啊。哈希一下,把任意长度的数据变成固定长度的摘要(比如256位),再对摘要签名,效率高得多。
在OTA升级中,签名流程是这样的:
# 生成签名(在服务器端)
openssl dgst -sha256 -sign private.pem -out firmware.sig firmware.bin
# 验证签名(在设备端)
openssl dgst -sha256 -verify public.pem -signature firmware.sig firmware.bin
设备端验证通过后,才允许升级。否则直接拒绝。
关键点:
公钥一定要安全地存储在设备中。我建议把公钥烧录在一次性可编程存储器(OTP)里,或者用安全芯片保护。如果公钥被篡改,那签名验证就形同虚设了。
最后说一句:数字签名不是万能的。它只能保证数据在传输过程中没被改,但保证不了原始数据本身是安全的。比如你签了一个有后门的固件,签名验证通过了,设备照样会中招。所以,代码审查和供应链安全同样重要。
这一章的内容就到这里。下一章我们实战——用OpenSSL生成密钥对,并制作第一个签名升级包。