一、Flash 加密功能用于加密与 ESP32-S2 搭载使用的 SPI Flash 中的内容。启用 Flash 加密功能后,物理读取 SPI Flash 便无法恢复大部分 Flash 内容。通过明文数据烧录 ESP32-S2 可应用加密功能,(若已启用加密功能)引导加载程序会在首次启动时对数据进行加密。

启用 Flash 加密后,系统将默认加密下列类型的 Flash 数据:

  • 引导加载程序
  • 分区表
  • 所有 “app” 类型的分区

其他类型的 Flash 数据将视情况进行加密:

  • 安全启动引导加载程序摘要(如果已启用安全启动)
  • 分区表中标有“加密”标记的分区

二、开发模式:可使用 ESP32-S2 内部生成的密钥或外部主机生成的密钥在开发中运行 Flash 加密。

三、发布模式:在释放模式下,UART 引导加载程序无法执行 Flash 加密操作,只能 使用 OTA 方案下载新的明文映像,该方案将在写入 Flash 前加密明文映像。

四、使用主机生成的 Flash 加密密钥:

1.可在主机中预生成 Flash 加密密钥,并将其烧录到 ESP32-S2 的 eFuse 密钥块中。这样,无需明文 Flash 更新便可以在主机上预加密数据并将其烧录到 ESP32-S2 中。该功能允许在 开发模式 和 发布模式 modes 两模式下加密烧录。

  • 确保您的 ESP32-S2 设备有 Flash 加密过程中使用的 eFuse 中所示 Flash 加密 eFuse 的默认设置。
  • 使用 espsecure.py 随机生成一个密钥:
    espsecure.py generate_flash_encryption_key my_flash_encryption_key.bin
  • 将该密钥烧录到设备上(一次性)。 该步骤须在第一次加密启动前完成,否则 ESP32-S2 将随机生成一个软件无权限访问或修改的密钥:
    espefuse.py --port PORT burn_key flash_encryption my_flash_encryption_key.bin
  • 在第二阶段引导加载程序中启用 Flash 加密支持。请前往 Project Configuration Menu,选择 “Security Features”。
  • 选择 Enable flash encryption on boot。
  • 模式默认设置为 开发模式。
  • 在引导加载程序 config 下选择适当详细程度的日志。
  • 保存配置并退出。

2.构建并烧录完整的映像包括:引导加载程序、分区表和 app。这些分区最初以未加密形式写入 Flash

idf.py flash monitor

3.下次启动时,第二阶段引导加载程序将加密 Flash 的 app 分区并重置该分区。现在,示例应用程序将在运行时解密并执行命令。在此阶段,如果用户希望将新的明文应用程序映像更新到 Flash,应调用以下命令

idf.py encrypted-app-flash monitor

五、读取加密的Flash

如在不使用 Flash 缓存 MMU 映射的情况下读取数据,推荐使用分区读取函数 esp_partition_read()。使用该函数时,只有从加密分区读取的数据才会被解密。其他分区的数据将以未加密形式读取。这样,软件便能同样访问加密和未加密的 Flash。通过其他 SPI 读取 API 读取的数据均未解密:

  • 通过函数 spi_flash_read() 读取的数据均未解密。
  • 通过 ROM 函数 SPIRead() 读取的数据均未解密(esp-idf app 不支持该函数)。
  • 使用非易失性存储器 (NVS) API 存储的数据始终从 Flash 加密的角度进行存储和读取解密。如有需要,则由库提供加密功能。

六、写入加密的Flash

在可能的情况下,推荐使用分区写入函数 esp_partition_write。使用该函数时,只有向加密分区写入的数据才会被加密。而写入其他分区的数据均未加密。这样,软件便可同样访问加密和未加密的 Flash。当 write_encrypted 参数设置为“是”时,函数 esp_spi_flash_write 将写入数据。否则,数据将以未加密形式写入。ROM 函数 esp_rom_spiflash_write_encrypted 将在 Flash 中写入加密数据,而 ROM 函数 SPIWrite 将在 Flash 中写入未加密数据(esp-idf app 不支持上述函数)。由于数据均采用块加密方式,加密数据最小的写入大小为 16 字节(16字节对齐)。

七、关闭Flash加密

若因某些原因意外启用了 Flash 加密,则接下来烧录明文数据时将使 ESP32-S2 软砖(设备不断重启,并报错 flash read err, 1000)。可通过写入 FLASH_CRYPT_CNT eFuse 再次关闭 Flash 加密(仅适用于开发模式下):

  • 首先,前往 Project Configuration Menu,在“安全性能”目录下关闭 启用 Flash 加密启动。
  • 退出 menuconfig 并保存最新配置。
  • 再次运行 idf.py menuconfig 并复核是否确认已关闭该选项!如果该选项仍处于已启用状态,则引导加载程序会在启动后立即重新启用加密。
  • 在未启用 Flash 加密的状态下,运行 idf.py flash 构建并烧录新的引导加载程序与 app。
  • 运行 espefuse.py (components/esptool_py/esptool 中)以关闭 FLASH_CRYPT_CNT:
    espefuse.py burn_efuse FLASH_CRYPT_CNT

重置 ESP32-S2,Flash 加密应处于关闭状态,引导加载程序将正常启动。

原文:https://docs.espressif.com/projects/esp-idf/zh_CN/v4.2/esp32s2/security/flash-encryption.html

ESP32的Flash加密知识的更多相关文章

  1. Nand Flash基础知识与坏块管理机制的研究

    概述 Flash名称的由来,Flash的擦除操作是以block块为单位的,与此相对应的是其他很多存储设备,是以bit位为最小读取/写入的单位,Flash是一次性地擦除整个块:在发送一个擦除命令后,一次 ...

  2. Flash 加密和破解

    关于Flash(swf),我们需要明确一点: ***Flash字节码的意义都是公开的 所以如果cracker真的有足够的耐心他最终还是可以破解掉你的Flash.我们能做的只是尽量提高Flash被破解的 ...

  3. Flash相关知识

    <object id="FlashID" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" wid ...

  4. FLASH的知识【转】

    转自:http://blog.csdn.net/xgbing/article/details/18422691 版权声明:原创文章,转载请注明来自:http://blog.csdn.net/xgbin ...

  5. HTTPS和HTTP(加密知识)

    什么是HTTPS? 基于安全套接字层的超文本传输协议(HTTP over SSL),一个Netscape开发的Web协议.HTTPS在HTTP应用层的基础上使用安全套接字层(或者升级版传输层安全,Tr ...

  6. [加密]ESP32 -Secure Boot 安全方案

    转自:https://blog.csdn.net/espressif/article/details/79362094 Secure Boot 功能概述 方案概述 Secure Boot 的目的是保证 ...

  7. nand flash详解及驱动编写

    https://www.crifan.com/files/doc/docbook/linux_nand_driver/release/html/linux_nand_driver.html#nand_ ...

  8. 如何为 esp32 编译和配置及烧写 MicroPython 固件。

    MicroPython 在 esp-idf (esp32) 上编译固件 esp32 编译 micropython 的固件相关的资料应该很多吧,我也会出一篇,但会额外讲一些 linux 的东西的. 资料 ...

  9. ATSHA204加密认证IC

    The Atmel® ATSHA204 is a full turnkey security device. It includes a 4.5Kb EEPROM divided into 16 sl ...

随机推荐

  1. Apache Jena Fuseki使用

    下载Apache Jena Fuseki 先从apache官网下载fuseki压缩包.然后解压到目标文件夹. apache官网:http://jena.apache.org/download/ 这里我 ...

  2. .Net RabbitMQ实战指南——RabbitMQ相关概念介绍

    什么是消息中间件 消息(Message)是指在应用间传送的数据.消息可以非常简单,比如只包含文本字符串.JSON等,也可以很复杂,比如内嵌对象. 消息队列中间件(Message Queue Middl ...

  3. 什么是 Web 服务器(server)

    首先我们来了解什么是服务器(server) Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档,[1]也可以放置网站文件,让全世界浏览:可以放置数 ...

  4. TVM自定义数据类型

    TVM自定义数据类型 本文将介绍"自定义数据类型"框架,该框架可在TVM中使用自定义数据类型. 介绍 在设计加速器时,关键是如何近似地表示硬件中的实数.这个问题具有长期的行业标准解 ...

  5. Java日期时间API系列39-----中文语句中的时间语义识别(time NLP 输入一句话,能识别出话里的时间)原理分析

    NLP (Natural Language Processing) 是人工智能(AI)的一个子领域.自然语言是人类智慧的结晶,自然语言处理是人工智能中最为困难的问题之一(来自百度百科). 其中中文更是 ...

  6. Spring Cloud05: Zuul 服务网关

    一.什么是Zuul 服务网关 Zuul 是 Netflix 提供的⼀个开源的 API ⽹关服务器,是客户端和⽹站后端所有请求的中间层,对外开放 ⼀个 API,将所有请求导⼊统⼀的⼊⼝,屏蔽了服务端的具 ...

  7. Linkerd 2.10(Step by Step)—使用 Kustomize 自定义 Linkerd 的配置

    Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...

  8. 【NX二次开发】 获取体的面 UF_MODL_ask_body_faces

    获取体的面 1 extern DllExport void ufsta(char *param, int *returnCode, int rlen) 2 { 3 UF_initialize(); 4 ...

  9. 入门Kubernetes - .Net Core 运行

    前言: 之前文章 对Kubernetes 的一些基础概念及在windows下的环境搭建,接下来把.Net Core 运行到Kubernetes 中,在实际的操作中,对Kubernetes 的进一步学习 ...

  10. C# 位图BitArray 小试牛刀

    前面聊了布隆过滤器,回归认识一下位图BitMap,阅读前文的同学应该发现了布隆过滤器本身就是基于位图,是位图的一种改进. 位图 先看一个问题, 假如有1千万个整数,整数范围在1到1亿之间,如何快速确定 ...