flash 加密指南
##esp32安全介绍
esp32有两个重要的功能,安全启动(secure boot) flash加密(flash encryption)
secure boot
flash encryption
flash 加密是由eFuse
flash加密分开发模式和生产模式:
开发模式:
生产模式:
flash 加密过程
假设eFuse值处于默认状态,并且第二阶段引导加载程序被编译为支持闪存加密,则闪存加密过程执行如下:
在首次上电复位时,闪存中的所有数据都是未加密的(纯文本)。
第一阶段引导程序(ROM)将在IRAM中加载第二阶段引导程序。
第二阶段引导程序将读取flash_crypt_cnt(= 00000000b)
eFuse值,并且由于该值为0(设置了偶数位数),因此它将配置并启用闪存加密块。它还会将FLASH_CRYPT_CFGeFuse
编程为值0xF。
闪存加密块将生成AES-256位密钥并存储到BLOCK1 eFuse中。此操作在硬件中执行,密钥无法通过软件访问。
接下来,闪存加密块将加密闪存内容(基于分区表标志值)。就地加密可能需要一些时间(大型分区最多只需一分钟)。
然后,第二阶段引导加载程序设置flash_crypt_cnt(= 00000001b)
中的第一个可用位,以将闪存内容标记为已加密(设置奇数位数)。
对于释放模式的第二阶段引导程序将编程download_dis_encrypt
,download_dis_decrypt
&download_dis_cache
的eFuse位为1,以防止引导程序UART从解密闪存内容。它还会写保护FLASH_CRYPT_CNT
eFuse位。
对于开发模式,第二阶段引导加载程序将仅编程download_dis_decrypt
&download_dis_cache
eFuse位,以允许UART引导加载程序重新刷新加密的二进制文件。此外,FLASH_CRYPT_CNT
eFuse位不会被写保护。
然后,第二阶段引导加载程序重新启动设备以开始执行加密映像。它将透明地解密闪存内容并加载到IRAM中。
在开发阶段,经常需要编写不同的明文闪存映像并测试闪存加密过程。这要求UART下载模式能够根据需要多次加载新的纯文本图像。但是,在制造或生产过程中,由于安全原因,不应允许UART下载模式访问闪存内容。因此,这需要两种不同的ESP32配置:一种用于开发,另一种用于生产。以下部分介绍了闪存加密的development模式和release模式以及使用它们的分步过程。
flash 加密步骤
1. Development Mode
利用esp32内部生成的密钥或外部主机生产的密钥来作为开发的flash加密过程进行开发
开发模式的flash加密过程:
- 切换到flash例程中:
cd $IDF_PATH/examples/get-started/hello_world
make menuconfig
->security features
->Enable flash encryption on boot
Partition Table
->offset of partition table
设置为0x10000
保存退出后,make -j8 flash monitor
就进行第一次烧录。
espfuse.py burn_efuse FLASH_CRYPT_CNT
Example to check Flash Encryption status
This is ESP32 chip with 2 CPU cores, WiFi/BT/BLE, silicon revision 0, 2MB external flash
FLASH_CRYPT_CNT eFuse value is 0
Flash encryption feature is disabled
Erasing partition "storage" (0x1000 bytes)
Writing data with esp_partition_write:
I (440) example: 0x3ffb4f60 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f |................|
I (440) example: 0x3ffb4f70 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f |................|
Reading with esp_partition_read:
I (450) example: 0x3ffb4f40 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f |................|
I (460) example: 0x3ffb4f50 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f |................|
Reading with spi_flash_read:
I (470) example: 0x3ffb4f40 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f |................|
I (480) example: 0x3ffb4f50 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f |................|
2. Release Mode
XXXXXXXXXX施工中XXXXXXXXX