ESP32 快速入门(十一):Secure Boot 与 Flash encryption 的介绍与实践

此篇博客为 ESP32 Secure Boot 与 ESP32 Flash encryption 的介绍与实践。

1 ESP32 Secure Boot

1.1 ESP32 Secure Boot 功能概述

  • Secure Boot 的目的是保证芯片只运行用户指定的程序,芯片每次启动时都会验证从 flash 中加载的 partition table 和 app images 是否是用户指定的
  • Secure Boot 中采用 ECDSA 签名算法对 partition table 和 app images 进行签名和验证,ECDSA 签名算法使用公钥/私钥对,秘钥用于对指定的二进制文件签名,公钥用于验证签名。
  • 由于 partition table 和 app images 是在软件 bootloader 中被验证的,所以为了防止攻击者篡改软件 bootloader 从而跳过签名验证,Secure Boot 过程中会在 ROM bootloader 时检查软件 bootloader image 是否被篡改,检查用到的 secure boot key 可由硬件随机数生成器产生,保存的 efuse 中,对于软件是读写保护的。

1.2 ESP32 Secure Boot 实践

此部分分为 开发者模式 和 量产模式。

1.2.1 开发者模式

make menuconfig 中的 Security features 里需要做以下配置:
在这里插入图片描述

在终端里需要执行以下指令:

  1. espsecure.py generate_signing_key secure_boot_signing_key.pem (生成私钥)
  2. espsecure.py digest_private_key --keyfile secure_boot_signing_key.pem secure-bootloader-key.bin (生成 bootloader key)
  3. espefuse.py burn_key secure_boot secure-bootloader-key.bin ( 将bootlaoder key 烧录 efuse)
  4. make bootloader (编译 bootloader 使用提示命令下载)
  5. make flash monitor (编译 app 文件并下载 打开串口)
  6. espsecure.py digest_secure_bootloader --keyfile secure-bootloader-key.bin --output bootloader-digest.bin bootloader.bin (重新生成 bootloader)
  7. esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 115200 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size detect 0x0 bootloader-digest.bin (重新烧录 bootlaoder)

1.2.2 量产模式

make menuconfig 中的 Security features 里需要做以下配置:
在这里插入图片描述

在终端里需要执行以下指令:

  1. espsecure.py generate_signing_key secure_boot_signing_key.pem (生成私钥)
  2. espsecure.py extract_public_key --keyfile secure_boot_signing_key.pem signature_verification_key.bin (提供私钥中的公钥)
  3. make bootloader (编译 bootloader 使用提示命令下载)
  4. make (编译固件)
  5. espsecure.py sign_data --keyfile secure_boot_signing_key.pem build/hello-world.bin (对固件进行签名)
  6. espsecure.py sign_data --keyfile secure_boot_signing_key.pem build/partitions_singleapp.bin (对固件进行签名)
  7. esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 115200 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size detect 0x10000 build/hello-world.bin 0x8000 build/partitions_singleapp.bin (固件烧录)

2 ESP32 Flash encryption

2.1 ESP32 Flash encryption 功能概述

  1. 由于 esp32 模组的 flash 放置与芯片片外,可以很轻易的通过物理手段读取。
  2. 那么为了保护客户固件以及隐私数据不被读取,所以需要 flash encryption 的功能。
  3. 使能 flash encryption 后,使用物理手段(如串口)从 SPI flash 中读取的数据都是经过加密的,大部分数据无法恢复出真实数据。
  4. flash encryption 使用 256-bit AES key 加密 flash 数据,key 保存在芯片的 efuse 中,生成之后变成软件读写保护。

2.2 ESP32 Flash encryption 实践

此部分分为 开发者模式 和 量产模式。

2.2.1 开发者模式

make menuconfig 中的 Security features 里需要做以下配置:
在这里插入图片描述
Flash encryption 步骤 :

  1. 输入 make menuconfig 配置 menuconfigsecurity features -> 启动 Enable flash encryption on boot (READ DOCS FIRST)
  2. espsecure.py generate_signing_key secure_boot_signing_key.pem (生成私钥)
  3. espsecure.py digest_private_key --keyfile secure_boot_signing_key.pem flash-encryption-key.bin (生成 flash encryption key)
  4. espefuse.py burn_key flash_encryption flash-encryption-key.bin ( 将 bootlaoder key 烧录 flash encryption key)
  5. make flash monitor (编译 app 文件并下载 打开串口)

重复烧录时的步骤 :

  1. espsecure.py encrypt_flash_data --keyfile flash_encrypt_key.bin --address 0x10000 -o build/hello_world_encrypt.bin build/hello_world.bin (重复烧录时使用秘钥加密)
  2. esptool.py —chip esp32 --port /dev/ttyUSB0 --baud 115200 --before default_reset --after hard_reset write_flash -z --flash_mode dio -- flash_freq 40m --flash_size detect 0x10000 hello_world_encrypt.bin

1.2.2 量产模式

make menuconfig 中的 Security features 里需要做以下配置:
ESP32 快速入门(十一):Secure Boot 与 Flash encryption 的介绍与实践_第1张图片

在终端里需要执行以下指令:

  1. make flash monitor (编译 app 文件并下载 打开串口)

你可能感兴趣的:(ESP32)