本帖最后由 会飞的猪_2020 于 2026-1-25 00:02 编辑
这篇文章记录了笔者对OTA升级的一些思考。我的目的是总结出OTA详细设计文档,喂给AI,让AI帮我实现一个OTA的代码。
在论坛里发表也是为了抛砖引玉和坛友们多多交流。
(AI创作声明,本文为笔者总结和AI之间的对话记录整理而成)

需求讨论——安全的OAT的“安全”一词具体体现在哪些方面?
1.运行可靠(必须)
这个是最基础的。至少升级不能升挂掉。如果升级过程中断电,需要保证至少能够回到BootLoader继续升级。
2.来源可靠(可选)
确保固件是由可信任来源发布,而不是黑客伪造。
3.内容可靠(必须)
确保固件在弱网传输中没有因为网络干扰、丢包或者认为篡改而发生任何变动。
4.过程可靠(可选)
防止黑客通过监听OTA升级引脚逆向工程分析出你的固件,整个传输过程必须是加密的。
5.版本可靠(可选)
防止黑客通过回滚带有漏洞的合法固件,需要记录版本号。拒绝升级低版本固件
需求讨论——“轻量级”
6.轻量级(必须)
为嵌入式系统设计,功能需要通过宏定义可裁剪,最精简的版本仅保证运行可靠和内容可靠,保证较低的Flash的Ram占用,供用户选择。而对于安全性能需求高的,可以打开相关宏定义,以支持丰富的加密验证功能。

1.运行可靠如何满足?
1.1 单分区覆盖
针对Flash资源受限制的芯片,提供基础的BootLoader+单分区APP的方案,该方案需要在BootLoader中实现通讯协议,接受固件并采用覆盖擦除的方式升级。固件擦除过程中如果发生掉电会导致APP无法正常运行(可接受),但是要保证程序仍然处于BootLoader状态中,可以再次升级。
1.2 双槽位搬运
针对Flash资源足够的芯片,提供BootLoader+双分区APP的方案,该方案BootLoader中仅做固件搬运,不需要通讯协议。程序在分区1中运行,接收固件后写入分区2。最后在BootLoader中将分区2的固件转移到分区1中。该方案可以保证擦除过程中掉电,也可以回滚到上个版本继续运行。
1.3 双Bank切换
对于支持双Bank切换机制的单片机,可以使用硬件映射交换Bank1/2
2.来源可靠如何满足?
需要利用非对称加密的方案实现。(例如ECDSA)
非对称加密利用了陷门单向函数——一种正向计算容易,但是反向计算很困难数学函数。但是如果你知道“陷门”,这个反向计算过程,会从及其困难变为及其容易。
公钥:发布给公众,一个正向的,确定的数学计算。(任何人都可以在拥有公钥的情况下,对信息进行加密)
黑客:没有“陷门”,反向计算要好几亿年。哪怕黑客截获了通信的数据,也无法获得明文。
私钥:你偷偷知道的“陷门”,有了它,反向计算会变得特别容易。你就可以知道公钥加密的信息了。
因为非对称加密算法本身无法处理很大的数据(比如128KB的固件),如果试图去做,可能STM32要算好几分钟,这显然不可接受。
标准的做法:
a.先用SHA-256把128KB的固件浓缩成一个哈希值。
b.在用ECDSA对这个哈希值进行签名。
私钥 (Private Key):保存在你的开发服务器(上位机软件或云端),绝对不能泄露。
公钥 (Public Key):硬编码在 STM32 的固件中。
打包阶段(服务器):
对固件原始数据计算 SHA-256 哈希值。
使用 私钥 对哈希值进行加密,生成 签名 (Signature)。
将 固件 + 签名 + 版本号 组合成升级包。
接收阶段(STM32):
将下载到非运行 Bank 的固件通过 公钥 进行验签。
如果验签通过,说明:
固件确实是由持有私钥的人发布的(来源可靠)。
固件在传输过程中没有被篡改过(内容完整)。
[C] 纯文本查看 复制代码 openssl ecparam -name prime256v1 -genkey -noout -out private_key.pem
[C] 纯文本查看 复制代码 openssl ec -in private_key.pem -pubout -out public_key.pem
# 查看公钥的十六进制结构
openssl ec -in private_key.pem -pubout -outform DER | tail -c 64 | xxd -i
MCU中可以采用intel的tinycrypt库,进行加解密。
3.内容可靠如何满足?
每包采取CRC校验,错误重传。
4.过程可靠如何满足?
传输过程中采取AES对称加密。
5.版本可靠
通过业务逻辑加判断实现

本文中提到的密钥需要保存在读保护区域。并且默认黑客无法绕过MCU的读写保护。
如果假设存在一个万能的黑客,能够破解读写保护,那么上述的安全功能是无效的。
他可以直接修改固件,跳过if判断逻辑。

笔者目前生成了第一版的提示词,还没仔细给AI审核。先去睡觉了,明天晚上有空仔细改一下需求。
提示词放在了github上。
https://github.com/FlyyingPiggy2020/SMOTA
第一版提示词.7z
(8.78 KB, 下载次数: 8)
|