乐鑫特权隔离机制 #4 | 用户应用程序的安全启动
乐鑫特权隔离机制 系列文章 #4
目录
安全启动 (Secure boot)
受保护应用程序的安全启动 (Secure boot for protected app )
用户应用程序的安全启动 (Secure boot for user app)
基于证书的验证方案 (Certificate-based verification scheme)
- 必要条件
- 验证过程
在上一篇文章中,我们演示了如何在乐鑫特权隔离框架中,独立地更新用户应用程序。简单来说,通过将受保护的应用和用户应用程序相互隔离,即可轻松实现对其中任意程序的独立更新。在这个框架下,为单个受保护的应用程序提供多个用户应用程序也成为可能,类似于应用程序的“应用程序商店”。然而,随着这些应用程序功能的日益丰富,提高其安全性的需求也随之增加。
本文中,我们将介绍“用户应用程序的安全启动机制”,该机制确保只有受信任和授权的用户应用程序,才能在设备上执行。
安全启动 (Secure boot)
安全启动流程可以确保仅有授权和受信任代码才能在设备上执行,常见的实现方法是通过构建“信任链”,即通过从一个受信任且无法更改的实体开始(例如硬件中的一次性可编程存储器),一步步构建完全值得信任的完整信任链。
使用乐鑫特权隔离框架的项目具有两类相互独立的应用程序二进制文件:受保护应用程序 (protected_app) 和用户应用程序 (user_app) ,可以独立完成更新。
乐鑫特权隔离框架可以为这两类应用程序提供安全启动流程,通过基于信任根的信任链,验证受保护应用和用户应用程序文件。
受保护应用程序的安全启动 (Secure boot for protected app )
受保护应用程序的安全启动遵循 ESP-IDF 中传统应用安全启动方案。

传统安全启动过程概述如下:
1. 芯片上电/复位时,ROM 引导加载程序开始执行。注意,这里的 ROM引导加载程序已经烧录在芯片中,无法改变,因此是可信的,将作为信任链的信任根。
2. ROM 引导加载程序在 flash 中查找有效的二级引导加载程序,如果找到,则使用 eFuse 中烧录的公钥哈希值,验证文件附加 RSA-3072 公钥。
3. 公钥验证完成后,继续使用经过验证的公钥验证整个二级引导加载程序文件的数字签名。如果数字签名验证成功,ROM 引导加载程序将二级引导加载程序加载到内存中,并开始执行。
4. 一旦二级引导加载程序开始执行,它就被视为受信任的实体。然后,二级引导加载程序将初始化系统,并尝试以类似的方式使用 eFuse 验证和加载受保护的应用程序。
更多详情,您可以查看 ESP-IDF 编程指南中的安全启动章节。
用户应用程序的安全启动 (Secure boot for user app)
如前所述,受保护应用程序和用户应用程序都可以独立开发,因此这两类应用程序的所有权可以属于不同单位,也就是说它们可能都需要单独的签名密钥。为了验证受保护应用程序,我们会在 eFuse 中烧录受保护应用程序公钥的哈希值,但出于节省 eFuse 内存的目的,并没有同样地烧录用户应用程序公钥的哈希值。
对此,我们特别为用户应用程序的安全启动设计了基于证书的验证机制。
基于证书的验证方案 (Certificate-based verification scheme)
在此方案中,受保护应用程序被视为受信任的应用程序,因此可以在受保护应用程序的固件中烧录一些信息,用于后续验证用户应用程序的真实性。
-
必要条件
采用该方案的受保护应用程序和用户应用程序必须满足一些条件。
受保护应用程序:
1. 受保护应用程序的所有者必须维护两组单独的 RSA-3072 私钥。一组用于对受保护的应用程序的固件进行签名,另一个用于创建 CA 证书。
2. 必须提供某种途径,允许用户应用程序开发人员获取签名证书。
3. 必须在其固件中嵌入 CA 证书。
用户应用程序:
1. 用户应用程序的所有者需要生成 RSA-3072 私钥,用于对用户应用固件进行签名,还用于生成证书签名请求(CSR)。
2. 必须将此 CSR 发送到受保护的应用程序 CA,并获取已签名的用户应用证书 (UAC)。
3. 必须使用 RSA-3072 私钥对固件签名。签名和用户应用证书必须随附在应用程序文件的末尾。
-
验证过程
该方案的验证流程如下:

1. 芯片复位时,ROM 引导加载程序将验证二级引导加载程序,然后验证受保护应用程序的RSA-3072 公钥,具体方式为:对比 eFuse 中烧录的 RSA 公钥哈希值与受保护应用程序文件末尾处附加的公钥哈希值。
2. 公钥验证完成后,继续使用经过验证的公钥验证受保护应用程序的 RSA-PSS 签名。如果验证成功,则可以将受保护的应用程序视为受信任的应用程序并允许启动。
3. 受保护应用程序启动后,会在 flash 中搜索有效的用户应用程序,如果找到,则将使用嵌入在受保护应用程序中的 CA 证书,来验证附加至用户应用程序文件末尾的用户应用证书 (UAC)。UAC 由受保护应用程序的 CA 私钥签名,因此可以通过 CA 证书中的 CA 公钥进行验证。
4. UAC 中包括相应用户应用程序签名密钥的公钥,一旦 UAC 通过受保护应用程序的验证,UAC 内部的公钥也可以被视为受信任。此后,受保护的应用程序使用此公钥,验证用户应用程序的 RSA-PSS 签名。
更多详情,您可以查看乐鑫特权隔离文档中的安全启动章节。
如有任何问题或反馈,欢迎随时在 GitHub 仓库中提交 issue。您可点此 乐鑫特权隔离机制 系列文章 查看往期,敬请期待后续的更多内容。
相关文章:
乐鑫特权隔离机制 #4 | 用户应用程序的安全启动
乐鑫特权隔离机制 系列文章 #4 目录 安全启动 (Secure boot) 受保护应用程序的安全启动 (Secure boot for protected app ) 用户应用程序的安全启动 (Secure boot for user app) 基于证书的验证方案 (Certificate-based verification scheme) 必要条件验证过程…...
剑指 Offer 46. 把数字翻译成字符串
摘要 剑指 Offer 46. 把数字翻译成字符串 一、递归算法解析 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。…...
tar命令——归档/压缩和解压缩文件
tar命令的功能是将一个或多个文件归档成一个文件,同时可结合gzip、bzip2和xz等压缩命令实现文件的压缩和解压缩。 tar 命令的语法格式如下: tar [选项] 文件或目录 常用选项如下: 选项作用/含义-c建立归档文件-x从归档文件中解出文件-z通…...
Softing smartLink网关——推进过程工业数字化转型
虽然在过程工业中各工厂所投入的运营时间千差万别,但仍需按照新标准来进行有效控制和管理,而这就需要使用一种能够聚合其异构数据的数字通信架构。对此,Softing提供了两种网关解决方案,可用于将过程工业通信架构集成到现有以太网系…...
Spark的常用算子
Spark的常用算子 目录内容Spark的常用算子一、转换算子(Transformation)二、行动算子(Action)三、键值对算子(PairRDDFunctions)四、文件系统算子(File System)Spark 内置算子是指 S…...
Unity Avatar Cover System - 如何实现一个Avatar角色的智能掩体系统
文章目录简介变量说明实现动画准备动画状态机State 状态NoneStand To CoverIs CoveringCover To Stand高度适配高度检测脚部IK简介 本文介绍如何在Unity中实现一个Avatar角色的智能掩体系统,效果如图所示: 初版1.0.0代码已上传至SKFramework框架Package…...
steam/csgo搬砖项目到底真的假的?
搬砖是从国外steam市场置办游戏装备回来,在国内网易buff售卖,低买高卖,产生利润的一个项目。 但我真正上手后,才知道steam是面向全球的游戏平台,用户真的大的夸张!!市场非常巨大,一…...
【Python笔记20230307】
基础 编码、解码 str.encode(utf-8) # 编码 str.decode(utf-8) # 解码关键字 import keyword keyword.kwlist格式化输出 % 占位符:%s 字符串%d 整数%f 浮点数Hello, %s % world Hi, %s, you have $%d. % (Michael, 1000000) 占位符的修饰符 -左对齐 .小数点后位数 0左边补零…...
SBOM应该是软件供应链中的安全主食
当谈到软件材料清单(SBOM)时,通常的类比是食品包装上的成分列表,它让消费者知道他们将要吃的薯片中有什么。 美国机构有90天时间创建所有软件的清单 同样,SBOM是一个软件中组件的清单,在应用程序是来自多个来源的代码的集合的时…...
[计算机组成原理(唐朔飞 第2版)]第一章 计算机系统概论 第二章 计算机的发展及应用(学习复习笔记)
第1章 计算机系统概论 1.1 计算机系统简介 1.1.1 计算机的软硬件概念 计算机系统由“硬件”和“软件”两大部分组成。 硬件 是指计算机的实体部分,它由看得见摸得着的各种电子元器件,各类光、电、机设备的实物组成如主机、外部设备等 软件 软件看不见…...
Python的数据分析相关的框架
Python特别强大,也是一款可以实现可数据分析语言,它有很多开源的库和工具,可以帮助数据科学家处理和分析数据。 以下是一些常用的Python库和工具: NumPy:NumPy是一个Python库,用于处理大型多维数组和矩阵&…...
为什么会出现植物神经紊乱 总是检查不出来该怎么办
植物神经紊乱是一种很多人都害怕的疾病,你们知道是为什么吗? 植物神经紊乱是一种神经系统失调导致的多种症状的总称,这种疾病是由于社会因素所诱发的脏器功能的失调,是一种非常复杂的疾病。而这种疾病是可能会发生在任何年龄阶段的…...
宏任务和微任务
JavaScript 把异步任务又做了进一步的划分,异步任务又分为两类,分别是: ① 宏任务(macrotask) 异步 Ajax 请求setTimeout、setInterval文件操作其它宏任务 ② 微任务(microtask) Promise.then…...
使用WebSocket、SockJS、STOMP实现消息实时通讯功能
客户端 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head><title>websocket client</title><script src"http://cdn.bootcss.com/sockjs-client/1.1.1/sockjs.min.js"></script>…...
C++回顾(十一)—— 动态类型识别和抽象类
11.1 动态类识别 11.1.1 自定义类型 C中的多态根据实际的对象类型调用对应的函数 (1)可以在基类中定义虚函数返回具体的类型信息 (2)所有的派生类都必须实现类型相关的虚函数 (3)每个类中的类型虚函数都需…...
雷电模拟器安卓7以上+Charles抓包APP最新教程
一、工具准备: 证书安装工具全局代理工具下载: https://download.csdn.net/download/weixin_51111267/87536481 二、Charles设置 (一)电脑上证书安装 (二)安卓模拟器上系统证书安装(RooT权限打…...
vsvode 配置sftp,连接远程linux全过程
在本地安装sftp插件,配置参数https://blog.csdn.net/u011119817/article/details/106630599在linux机台安装vscode-service服务https://zhuanlan.zhihu.com/p/294933020连接超时,将配置文件添加超时时间遇到的错误处理:(272条消息) 【vscode插…...
C++类转换为蓝图、打印日志、蓝图关卡、删除C++文件
蓝图宏 UCLASS(Blueprintable)//c脚本可转换为蓝图 UPROPERTY(BlueprintReadWrite)//蓝图中可创建set,get节点 UFUNCTION(BlueprintCallable)//可创建函数节点 UPROPERTY(BlueprintReadWrite,Category”My Variables”)//节点进行分类打印日志 UE_LOG(LogTemp, Lo…...
elasticsearch高级篇:核心概念和实现原理
1.elasticsearch核心概念1.1 索引(index)一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母&#…...
部署安装Nginx服务实例
其他服务: 搭建zabbix4.0监控服务实例 普罗米修斯监控mysql数据库实战 Linux安装MySQL数据库步骤 一. Nginx概念介绍 1.介绍Nginx程序 Nginx (engine x) 是一款开源且高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。主要特点是占用…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
