儲能光伏控制器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固件的大小。