此篇博客为 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
里需要做以下配置:
在终端里需要执行以下指令:
espsecure.py generate_signing_key secure_boot_signing_key.pem
(生成私钥)espsecure.py digest_private_key --keyfile secure_boot_signing_key.pem secure-bootloader-key.bin
(生成 bootloader key)espefuse.py burn_key secure_boot secure-bootloader-key.bin
( 将bootlaoder key 烧录 efuse)make bootloader
(编译 bootloader 使用提示命令下载)make flash monitor
(编译 app 文件并下载 打开串口)espsecure.py digest_secure_bootloader --keyfile secure-bootloader-key.bin --output bootloader-digest.bin bootloader.bin
(重新生成 bootloader)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
里需要做以下配置:
在终端里需要执行以下指令:
espsecure.py generate_signing_key secure_boot_signing_key.pem
(生成私钥)espsecure.py extract_public_key --keyfile secure_boot_signing_key.pem signature_verification_key.bin
(提供私钥中的公钥)make bootloader
(编译 bootloader 使用提示命令下载)make
(编译固件)espsecure.py sign_data --keyfile secure_boot_signing_key.pem build/hello-world.bin
(对固件进行签名)espsecure.py sign_data --keyfile secure_boot_signing_key.pem build/partitions_singleapp.bin
(对固件进行签名)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 功能概述
- 由于 esp32 模组的 flash 放置与芯片片外,可以很轻易的通过物理手段读取。
- 那么为了保护客户固件以及隐私数据不被读取,所以需要 flash encryption 的功能。
- 使能 flash encryption 后,使用物理手段(如串口)从 SPI flash 中读取的数据都是经过加密的,大部分数据无法恢复出真实数据。
- flash encryption 使用 256-bit AES key 加密 flash 数据,key 保存在芯片的 efuse 中,生成之后变成软件读写保护。
2.2 ESP32 Flash encryption 实践
此部分分为 开发者模式 和 量产模式。
2.2.1 开发者模式
在 make menuconfig
中的 Security features
里需要做以下配置:
Flash encryption 步骤 :
- 输入
make menuconfig
配置menuconfig
中security features
-> 启动Enable flash encryption on boot (READ DOCS FIRST)
espsecure.py generate_signing_key secure_boot_signing_key.pem
(生成私钥)espsecure.py digest_private_key --keyfile secure_boot_signing_key.pem flash-encryption-key.bin
(生成flash encryption key
)espefuse.py burn_key flash_encryption flash-encryption-key.bin
( 将bootlaoder key
烧录flash encryption key
)make flash monitor
(编译 app 文件并下载 打开串口)
重复烧录时的步骤 :
espsecure.py encrypt_flash_data --keyfile flash_encrypt_key.bin --address 0x10000 -o build/hello_world_encrypt.bin build/hello_world.bin
(重复烧录时使用秘钥加密)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
2.2.2 量产模式
在 make menuconfig
中的 Security features
里需要做以下配置:
在终端里需要执行以下指令:
make flash monitor
(编译 app 文件并下载 打开串口)