完整的 ESP32 物联网设备安全指南

发布: (2026年1月10日 GMT+8 22:37)
12 分钟阅读
原文: Dev.to

Source: Dev.to

请提供您希望翻译的具体文本内容,我将按照要求保留源链接、格式和技术术语,仅翻译正文部分。谢谢!

1. 内置 ESP32 安全特性

功能描述
安全启动(v1 与 v2)确保只有签名固件能够运行。
闪存加密对存储在外部闪存中的所有数据进行加密。
硬件随机数生成器用于加密的真随机数生成器。
AES / SHA / RSA / ECC 加速器快速的硬件加速密码运算。
电子熔丝用于永久配置的一次性可编程位。
内存保护防止未授权的读取/写入。
安全密钥存储将密钥保存在硅片内部,永不暴露给软件。

这些特性协同工作,确保只有受信任的固件在设备上运行,敏感数据保持加密,且密码运算高效安全。

2. 威胁概览

威胁典型攻击向量
物理访问直接探测、闪存提取
固件提取UART、SPI 闪存读取
恶意 OTA 更新被篡改的固件镜像
Wi‑Fi 中间人攻击 (MITM)恶意接入点、数据包嗅探
凭证泄露硬编码密码、日志
云 API 滥用被盗令牌、重放攻击
设备克隆重复 ID、伪造硬件

良好的安全设计假设攻击者可能拥有临时物理访问完整网络可视性

3. 安全启动

3.1 概述

安全启动保证只有您签名的固件能够运行。如果攻击者修改了固件,设备将拒绝启动。

版本要点
Secure Boot v1基于 RSA 的签名验证
Secure Boot v2改进的密钥管理,支持更强的算法(推荐用于新项目)

3.2 实现步骤

  1. 在离线安全机器上生成密钥
  2. 绝不要在源码仓库中存放私钥
  3. 将公钥哈希写入 eFuse(一次性)。
  4. 使用私钥对固件镜像进行签名
  5. 启动时,ROM 引导加载程序 验证签名
  6. 若验证失败,启动被中止。

最佳实践

  • 在开发早期就 启用安全启动
  • 测试完成后 锁定 eFuse

4. Flash 加密

Flash 加密可保护存储在外部 flash 中的固件和数据。若未启用加密,任何拥有物理访问权限的人都可以读取固件和机密信息。

4.1 加密内容

  • 应用固件
  • Wi‑Fi 凭证
  • API 令牌
  • 证书
  • 存储在 flash 中的自定义数据

4.2 工作原理

  • ESP32 使用 AES‑XTS 加密。
  • flash‑encryption key 安全存放在 eFuse 中。
  • 对 flash 的所有读写都是 透明 的——硬件会自动进行加密/解密。

4.3 模式

模式描述
Development允许重新烧写(适用于原型开发)。
Release永久锁定加密(用于量产)。

最佳实践

  • 在大规模生产前切换到 release 模式

5. eFuses

eFuses 是 ESP32 内部的一次性可编程位。它们控制关键的安全特性。

5.1 重要的 eFuse 用途

  • 安全启动密钥哈希
  • Flash 加密密钥
  • 禁用 JTAG
  • 禁用 UART 下载模式
  • 配置调试访问

5.2 建议

  • 在量产前规划 eFuse 使用
  • 记录 每个阶段烧录了哪些 eFuse。
  • 使用 脚本(或 CI 流水线)以确保编程一致。
  • 避免在生产线上手动烧录——一旦烧录,eFuse 无法撤销。

6. 调试接口(UART / JTAG)

调试端口在开发期间很有用,但在生产环境中可能带来风险。

操作如何确保安全
禁用 JTAG烧录相应的 eFuse。
禁用 UART 引导加载程序(如果使用 OTA)烧录 UART 禁用 eFuse。
要求对任何调试接口进行身份验证如有需要,实施自定义引导加载程序逻辑。

注意: 保持调试端口开放是最常见的 ESP32 安全错误之一。

7. Wi‑Fi 安全

7.1 网络配置

  • 始终使用 WPA2 或 WPA3
  • 绝不在生产设备上使用开放网络

7.2 凭证配置

方法好处
基于 BLE 的加密配置安全、用户友好。
临时 AP 模式(一次性密码)首次设置简便。
基于二维码的配置快速、带外。
  • 绝不要在未加密的通道中泄露 Wi‑Fi 凭证

8. 安全通信

所有 ESP32 与服务器之间的通信必须加密。

  • ESP‑IDF 通过 mbedTLS 并使用硬件加速来支持 TLS

8.1 关键要点

  • 始终使用 HTTPS基于 TLS 的 MQTT
  • 验证服务器证书(不要禁用验证)。
  • 在可能的情况下使用证书固定
  • 为了降低内存使用,优先选择 ECC 证书

8.2 常见陷阱

  • 禁用证书验证。
  • 使用过时的 TLS 版本(例如 TLS 1.0)。
  • 将私钥直接嵌入固件中。

9. 设备身份与认证

每个 ESP32 设备都应拥有 唯一身份

身份类型实现方式
制造时烧录的设备 UUID存储在 eFuse 或 OTP 存储器中。
每设备证书用于双向 TLS。
带轮换的基于令牌的认证从安全服务器获取短期令牌。
硬件支持的密钥利用 ESP32 的安全密钥存储。

切勿在所有设备之间共享单一 API 密钥。

10. 空中升级 (OTA) 更新

OTA 更新功能强大,但如果被篡改则非常危险。

10.1 安全 OTA 工作流

  1. 签署固件镜像(使用与安全启动相同的密钥)。
  2. 在设备上验证签名,然后再进行安装。
  3. 通过 TLS 下载
  4. 实现回滚保护(防止降级到存在漏洞的固件)。
  5. 安全存储更新元数据(例如版本号、哈希值)。

ESP32 支持 安全 OTA,并将签名验证与安全启动集成。

11. Secret Management

Bad PracticeSecure Alternative
在源代码中硬编码 API 密钥存储在加密闪存中或使用安全元件。
以明文存储密码在运行时派生密钥,使用密钥派生函数。
在日志中打印机密信息对机密数据进行脱敏或避免记录。
通过调试命令泄露机密信息限制调试访问,要求身份验证。
未轮换凭证定期轮换,使用短期令牌。

从服务器获取短期令牌并定期轮换凭证。

12. 云端安全

设备安全并不止于硬件。

  • 对每个设备进行单独认证(相互 TLS、JWT 等)。
  • 实施速率限制以减轻暴力破解攻击。
  • 验证负载(模式、大小、内容)。
  • 对 API 使用基于角色的访问控制 (RBAC)
  • 记录可疑行为并触发警报。

您的云应 假设某些设备最终可能被攻陷,并设计成能够遏制其影响。

13. 生产检查清单

步骤描述
刷写最小可信引导加载程序降低攻击面。
烧录安全启动密钥实现固件真实性。
烧录闪存加密密钥保护静态数据。
编程设备身份唯一的每台设备 ID 或证书。
锁定调试接口根据需要禁用 JTAG/UART。
验证启动和连接自动化健全性测试。
实现全自动化避免手动步骤;使用 CI/CD 流水线。

14. 持续维护

  • 安全不是一次性任务。
  • 从第一天起支持 OTA 更新,以快速修补漏洞。
  • 监控 ESP‑IDF、第三方库以及硬件本身的漏洞。
  • 定期审计 你的代码、构建过程和部署流水线。

为构建安全 ESP32‑基物联网解决方案的开发者准备。

P‑IDF 安全检查清单

通用实践

  • 在可能的情况下轮换密钥。
  • 为设备退役做好规划。
  • 提供执行安全擦除的出厂重置。
  • 将安全特性视为其他特性——必须 测试

测试与验证

  • 尝试提取固件。
  • 尝试无签名固件启动。
  • 对 TLS 流量进行中间人攻击。
  • 重放指令数据包。
  • 进行电源扰动测试(如果需要高安全性)。
  • 记录测试结果,并对 每个版本 重复测试。

常见陷阱需避免

  • 将安全启动保持为禁用。
  • 未使用闪存加密。
  • 使用共享凭证。
  • 禁用 TLS 验证。
  • 暴露调试接口。
  • 仅依赖网络安全。

为什么重要

ESP32 提供强大的安全能力,但仅在正确使用时才有效。
许多不安全的物联网设备的出现 并非 因为 ESP32 本身薄弱,而是因为安全性被事后才考虑。

一个安全的 ESP32 设备需要在每一层都加以关注——从硅芯片和引导加载程序到固件、网络、云端以及制造环节。

  • 专业/商业物联网产品: 启用安全启动、闪存加密、正确的设备身份以及安全 OTA 更新是 强制性 的。
  • 业余项目: 遵循这些实践可为实际部署做好准备并保护用户。

安全是一个过程,而非功能。
及早开始,精心设计,并把每个 ESP32 设备都视作会受到攻击——因为最终,它们一定会被攻击。

Back to Blog

相关文章

阅读更多 »

你好,我是新人。

嗨!我又回到 STEM 的领域了。我也喜欢学习能源系统、科学、技术、工程和数学。其中一个项目是…