储能光伏控制器wifi模组乐鑫esp32蓝牙wifi芯片Flash加密方案,Flash加密方案用于增强数据安全中的数据机密性保护。启用 Flash加密功能后,物理读取Flash的数据后是无法识别其原始内容的。如前所述,数据机密性保护需要从数据传输、数据存佛两个方面进行考虑。Flash 加密方案可用于保护存储在设备 Flash 上的数据机密性,数据传输时的机密性保护需要其他方案,如使用支持加密的传输协议(HTTPS) 来实现。
与Flash 加密方案相关的存储区域
与Flash 加密方案相关的存储介质主要有 eFuse 和 Flash 两种,二者都可用于存储数据,但是具有不同的性质与用途。
Flash:
主要存储内容:Bootloader.bin、app.bin、nvs数据和分区表等数据
特性:允许反复擦除和读写
eFuse:
主要存储内容:
储能光伏控制器wifi模组乐鑫esp32蓝牙wifi芯片版本和 MAC 等系统参数,以及与一些系统功能相关的密钥和控制位
特性:具有不可逆的写入特性,即每位只能从0写为 1,且一旦写为1后将无法重置为 0。特别地,一些eFuse 中的区域在开启读保护后,这些区域的数据仅能通过设备自身的硬件模块访问。
储能光伏控制器wifi模组乐鑫esp32蓝牙wifi芯片采用 Flash 加密方案加密的数据存储在 Flash 上,包括 Bootloader 固件、app 固件、分区表,以及其他在分区表中标记 encrypted 的分区数据。
以下述分区表为例,启用 Flash 加密方案后,加密分区包括 Bootloader 分区、factory 分区、storage分区和 nvs key 分区。其中用于存储固件的分区,如 Bootloader 分区和 factory 分区是默认加密的,因此不必对其添加 encrypted 标记。
1.# Name,Type, SubTyper,offset,Sizer,Flags
2.nvs,data, nvs, ,0x6000,
3.#Extra partition to demonstrate reading/writing of encrypted flash
4.storage, data,0xff,,0x1000,encrypted
5.factory,app,factory,,1M
6. # nvs key partition contains the key that encrypts the NVS partition named nvs.
7.The nvs_key partition needs to be encrypted.
8.vns_key,data,nvs_keys,,0x1000,encrypted,
Flash 加密方案用于加密存储在 Flash 上的数据,但该方案的实现还用到了 eFuse 存储介质。
我们可以使用 espeFuse.py 查看 ESP32-C3 当前的 eFuse 状态,如使用下述命令,储能光伏控制器wifi模组乐鑫esp32蓝牙wifi芯片将看到eFuse中一些区域的当前值。
$espefuse.py --port PORT summary//使用当前设备的 port 口替换示例中的 PORT
输出 Log 如下,其中 FLASH_CRYPT_CNT 为0,代表当前未启用 Flash 加密方案。
espefuse.py v2.6-betal
Connecting........__.
EFUSE_NAME Description=[Meaningful Value] [Readable/Writeable] (Hex Value)
----------------------------------------------------------------------------------------------------------------------
Security fuses:
FLASH_CRYPT_CNT Flash encryption mode counter =0R/W (0x0)
FLASH_CRYPT_CONFIG Flash encryption config (key tweak bits) =0R/W (0x0)
CONSOLE_DEBUG_DISABLE Disable ROM BASIC interpreter fallback =1 R/W (0x1)
Identity fuses:
MAC MAC Address
= 30:ae:a4:c3:86:94 (CRC 99 0K) R/W
...
Flash 加密方案使用的加密算法
Flash 加密方案使用的对称加密算法是 AES-XTS,该算法是一种可调整分组的加密算法。在进行加密时,该算法分块地加密明文数据,并依据明文数据的偏移地址动态地调整密钥进行加密。储能光伏控制器wifi模组乐鑫esp32蓝牙wifi芯片AES-XTS-128 分组加密的基本原理,其中 64 B 的明文数据被划分为4块,加密每块数据使用的密钥 (keyl~key4) 均是由 base_key 派生的密,将每块加密的数据块组合,就可得到 64 B 的加密数据。
AES-XTS 这种先动态调整加密密钥,再进行加密的方法带来的好处是:
(1)相同的数据块加密后得到的密文是不同的,这使得加密后的数据更不容易被分析破解得到明文数据,因此增加了数据的机密性。
(2)不同数据块可以独立进行加密和解密,即使一块加密数据被损坏,也不会影响其他块数据解密,数据块之间的加/解密是相对独立的。
存储 Flash 加密方案的密钥
Flash 加密方案的密钥终保存在 eFuse 的 BLOCK_KEY 区域中,将密钥导入 eFuse 的方式有以下两种:
(1)手动方式。使用espsecure.py 脚本工具手动生成密钥,并将密钥导入eFuse 中,这种方式只能在第一次启用 Flash 加密方案前使用。
(2)自动方式。在 menuconfig 中启用 Flash 加密方案后,设备端将在首次启动时,在Bootloader 中自动生成密钥,并自动将密钥保存在 eFuse 中。
使用手动方式导入密钥时,需要预先生成 Flash 加密方案的密钥。运行下述命令可生成密钥:$ espsecure.py generate_flash_encryption_key my_flash_encryption_key.bin
运行下述命令可手动地将密钥导入 eFuse:
$ espefuse.py --port PORT burn_key BIOCK my_flash_encryption_key.bin XTS_AES_128_KEY注意:由于 eFuse 具有不可逆的写入特性,所以手动将密导入 eFuse 的操作只能进行一次通过menuconfig - Security features - Enable flash encryption on boot选项可使用 Flash 加密方案。若在编译时使用了 Flash 加密方案,并且没有预先通过手动方式导入密钥,则在烧录固件后,储能光伏控制器wifi模组乐鑫esp32蓝牙wifi芯片设备将启用 Flash 加密方案,然后自动地生成密钥,并将密钥导手动方式和自动方式的主要区别是:在使用手动方式时,用户可以知道密钥的内容,可以先入eFuse 中。使用脚本工具手动加密数据,再将加密数据烧录到设备上; 在使用自动方式时,若在 eFuse中开启了对 BLOCK_KEY 的读保护 (默认是开启的),由于密在设备内产生,并且直接存储在 eFuse 内的密钥是读保护的,则外界的所有开发人员都无法获取密钥的内容,更不能手动加/解密数据。
在手动方式下,可以通过下面的命令来加密 app 固件,并将加密后的 app 固件烧录到设备中运行。
$ espsecure.py encrypt_flash_data --aes_xts --keyfile /path/to/key.bin --address0x10000 --output my-app-ciphertext.bin build/my-app
值得一提的是,在输入 espsecure.py encrypt_flash_data 命令加密数据时,必须指定要加密的数据块在分区表中的存储地址。在上面的示例中,要加密的数据是 my-app,其地址为 0x10000。储能光伏控制器wifi模组乐鑫esp32蓝牙wifi芯片Flash 加密方案使用的加密算法是一种可调分组的加密算法 AES-XTS,该算法的加密过程与数据所在的位置有关。如果不指明位置或者指定的位置是错误的,则在烧录加密后的固件后,设备将会出错。此外,在知道密钥的情况下,脚本工具 espsecure.py 也可以解密加密后的数据,运行命令 espsecure.py-h 可获取该脚本工具的帮助信息。在量产时推荐使用自动方式导入密钥,因为这样可以方便地为每个设备配置不同的密钥,并且密钥从不在设备之外的场所被使用,这样将大程度地提高设备的安全性
Flash 加密的工作模式
Flash 加密共有两种工作模式:
(1)开发模式。顾名思义,开发模式是可以在开发阶段使用的工作模式。在开发阶段经常需要编写不同的明文固件,以及测试 Flash 加密过程。这就要求能够根据需求不断地将新固件烧录到设备端。在开发模式下,可以选择关闭已经启用的 Flash 加密,并且可以通过命令重新烧录新固件。
(2)量产模式。量产模式是在设备量产时推荐使用的工作模式。在设备量产时,出于安全考虑,串口不应有权限访问 Flash 内容,因此在启用该模式后,将默认禁用串口访问 Flash 的功能。此外,在该模式下,储能光伏控制器wifi模组乐鑫esp32蓝牙wifi芯片启用 Flash 加密后,不可以关闭 Flash 加密功能,并且不可以通过串口来更新固件,只能通过 OTA 升级的方式来更新固件。
通过menuconfig-->security features-->Enable flash encryption on boot-->Enableusage mode 选项可以选择 Flash 加密的工作模式,图 13-9 所示为将 Flash 加密的工作模式配置为开发模式。
[]Require signed app images
[]Enable hardware Secure Boot in bootloader (READ DOCS FIRST)
[]Enable flash encryption on boot (READ DOCS FIRST)
[]Enable usage (Development (NOT SECURE))-->
[]Potentially insecure options--->
[]Check Flash Encryption enabled on app startup (NEW)
[]UART ROM download mode (UART ROM download mode (Enabled (not recommended))) --->
图13-9将 Flash 加密的工作模式配置为开发模式
注意:在开发模式下,通过 espefuse.py --port PORT burn_efuse_SPI_BOOT_CRYPT_CNT命令可关闭已经启用的 Flash 加密方案;储能光伏控制器wifi模组乐鑫esp32蓝牙wifi芯片在关闭 Flash 加密方案后,请在 menuconfig中取消中启用 Flash 加密方案的选项,然后使用 dfpy flash 命令重新烧录新图件。此外,关闭机Flash 加密方案的次数受到 eFuse 中 SPI_BOOT_CRYPT_CNT 标志位长的限制,若该标志位的中包含奇数个1,则表示启用 Flash 加密方案,若包含偶数个1,则表示关闭 Flash 加密方案.周此在该标志位的长度为 3 bit 时,启用 Flash 加密方案后多允许关闭1次。
在使用储能光伏控制器wifi模组乐鑫esp32蓝牙wifi芯片Flash 加密方案后,Bootloader 的体积可能会增大,可以通过下述两种方法进行调整:
11)通过 menucofig --> Partition Table --> Offset of partition table 调整分区表在 Flash 中的偏移地址,如将默认的偏移地址 0x8000 增大到 0xa000,则存储 Bootloader的Flash 空间将增大 8KB。
注意,在调整 Bootloader 的分区地址后,请检查分区表存储的区域划分是否需要更新。
(2)通过 menuconfig --> Bootloader log verbosity 更改 Bootloader 编译时的 Log级别。将默认的 Log 级别Info 改为 Warning,可将减少固件中的 Log 数量,从而缩小 Bootloader固件的大小。