一、 综述

  在车辆ECU中总是有一些密钥或重要数据需进行机密性保护,但因产品选型、成本等考虑,导致一些ECU的芯片不支持硬件安全模块(例如HSM、TEE等)。此时,为保障数据的机密性,可考虑通过软件实现数据的安全存储:将需保护的数据加密后存储到NVM中。

二、方案

2.1 方案概述

  对业务数据使用AES-256算法(AES-256算法使用的密钥称为保护密钥)进行加密,随后将加密后的业务数据密文存储在NVM中。此时将对业务数据的保护转换对保护密钥的保护,后续只需保障保护密钥不被泄露和被篡改,即可保障业务数据的安全性。方案通过特定的密钥派生算法,基于种子,生成保护密钥。

  将种子拆分成多份的主要目的是提升攻击者通过逆向方法获取保护密钥的难度。在攻击者对编译后的Image进行静态分析时,可有效提升分析难度,避免通过扫描String字符串方式直接获取到保护密钥。

  • 密钥派生算法:可使用PBDKF2、Bcrypt、Scrypt等,实际可集合具体场景确定。本文后续以PBKDF2举例
  • 种子:可使用多种形式的种子或互相结合形成种子
      1. 保存在NVM中的随机数
      1. 硬编码在代码中的固定值
      1. 读取芯片特征值,例如芯片ID
      1. OTP中存储的值

  总体流程如下:
在这里插入图片描述

2.2 保护密钥生成

  将业务数据进行加密存储后,即可使用把对业务数据的保护转换为对保护密钥的保护。为提升保护密钥的安全性,需仅在需要保护密钥时,基于特定种子进行生成,避免保护密钥长期直接存在于ECU中。保护密钥生成流程如下:

  1. 通过第一个种子和salt(salt也可以理解为1个种子,salt值可使用和种子相同的方式选择),使用密钥派生算法PBKDF2-HMAC-SHA256生成32字节的派生密码;
  2. 以步骤1中生成的派生密码和第二个种子为基础,使用密钥派生算法PBKDF2-HMAC-SHA256进行运算,得到32字节的派生密码;
  3. 以步骤2中生成的派生密码和第三个种子为基础,使用密钥派生算法PBKDF2-HMAC-SHA256进行运算,得到32字节的派生密码,即为最终的保护密钥;

保护密钥生成过程应封装为一个函数,便于后续初始化和运行阶段直接调用。通过调用保护密钥生成函数,可直接获得保护密钥。

在这里插入图片描述

2.3 数据场景

  业务数据使用需考虑两种场景

    1. 数据预置且不修改:对于预置数据需手动在PC等环境中实现保护密钥生成和业务数据加密过程,得到业务数据明文。随后将此业务数据密文写入NVM或硬编号在代码中。ECU只需要执行解密过程即可
    1. 动态写入数据:通过产线或运行时写入,例如VIN、UDS 2E等服务。当ECU接收到此数据后,调用加密过程进行加密,得到业务数据密文并写入NVM。当ECU需要使用时,调用解密过程进行解密,即可得到业务数据明文以进行使用。此场景需考虑对写入前的默认值保护,若默认值无需保护,则默认值可明文写入NVM。否则需按照“数据预置且不修改”中方式在ECU外部先将业务数据明文转换为业务数据密文。

2.3.1 数据为预置且不修改

  此类数据需在ECU外部实现加密过程,ECU仅实现解密过程。加密后的业务数据密文可考虑硬编码在代码或写入NVM中。当ECU使用时,读取硬编码或NVM中的业务数据密文,随后生成保护密钥并调用AES解密,获得业务数据明文。总体流程如下图

在这里插入图片描述

2.3.2 动态写入数据

2.3.2.1 默认值无需保护

  当默认值无需保护时,NVM存储的默认值应为明文,当前业务数据应写入到1个结构体中,结构体可定义如下:

struct bussiness_data {unsigned int flag;// 指明bu_data数据是类型,0:明文存储,other:密文存储unsigned char bu_data[N];//具体长度需结合业务数据确定,需注意AES加密需填充,此处长度需为填充后的长度
};
    1. 写入默认值:当业务数据为默认值时,flag需置为0,bu_data中保存业务数据默认值的明文。默认值结构体跟随软件包等刷入ECU NVM特定区域。
    1. 写入有效数据:当需要写入有效的业务数据时,通过UDS、刷写等方式,此时ECU接收到的为业务数据的明文,ECU需调用AES加密算法,生成业务数据密文,生成业务数据密文后及时销毁保护密钥。设置存储结构体,flag值为1,bu_data为业务数据密文,并将结构提供更新到NVM中(覆盖默认值)。
    1. 当ECU使用业务数据时,首先读取NVM中存储的业务数据结构体,并判断flag值,若值为0,则直接读取bu_data用于业务场景使用。若flag值为1,读取bu_data后,使用AES进行解密,获得业务数据明文,用于业务操作场景,业务操作使用完成后,需立即销毁DDR中的保护密钥。

在这里插入图片描述

2.3.2.2 默认值需保护

  当默认值需保护时,NVM存储的默认值也需要为密文。总体流程如下:

    1. 写入默认值:当业务数据为默认值时,需在ECU外部环境中实现密钥保护和加密算法,将默认值转换为密文,并随软件包刷写等方式,同步存储到NVM特定区域中。
    1. 写入有效数据:当需要写入有效的业务数据时,通过UDS、刷写等方式,此时ECU接收到的为业务数据的明文,ECU需调用AES加密算法,生成业务数据密文,生成业务数据密文后及时销毁保护密钥。并将业务数据密文更新到NVM中(覆盖默认值)。
    1. 当ECU使用业务数据时,读取NVM中的存储的业务数据密文,使用AES进行解密,获得业务数据明文,用于业务操作场景,业务操作使用完成后,需立即销毁DDR中的保护密钥。

在这里插入图片描述

三、优化

  具体项目中需结合实际使用场景,确定业务数据明文是常驻内存还是每次使用时解密。若对使用频繁或对性能有要求(例如SecOC密钥等),则业务数据明文可常驻内存。否则,建议选择更安全的每次使用时解密。

四、扩展

4.1 AES算法

  本方案对业务密钥进行加解密的算法为AES-256,使用CBC模式。CBC的IV可和种子一样选择不同的方式。

4.2 PBKDF2算法

  本方案选择密钥派生算法PBKDF2。PBKDF2算法为一种密钥派生算法,PBKDF2算法主要用在防止暴力破解场景,通过增加单次迭代的时间,使暴力破解时间成倍增长,从而提升暴力破解成本。但本方案并不使用此特性,本方案主要目的在通过一组种子作为输入,生成一个关联的派生密钥,作为保护密钥。当种子固定时,通过PBKDF2算法生成的保护密钥必定固定。

在这里插入图片描述

  PBKDF2算法涉及参数如下:

  • 盐值:32字节长度,可预定义好并硬编码到代码中,也可像选择种子一样选择一个salt。
  • 迭代次数:2次。因本项目不使用防止暴力破解特性,故次数并不影响安全性,结合效率考虑。需集合实际项目性能,调整次数。
  • 伪随机函数:HMAC-SHA-256算法
  • 输出密钥长度:32字节

4.3 种子选择

  种子可以由多种来源,若从稳定性角度考虑,使用硬编码种子最稳定,若需要一机一密等场景,则可使用芯片ID或者随机数,实际使用选择种子时应结合具体场景选择合适的种子。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/93765.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/93765.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/93765.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI 效应: GPT-6,“用户真正想要的是记忆”

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

云计算学习100天-第25天

部署LNMP环境安装软件#在前一天已经安装nginx的基础上安装MariaDB,php和php-fpm yum -y install mariadb mariadb-server mariadb-devel php php-mysqlnd php-fpm #mariadb(数据库客户端软件)、mariadb-server(数据库服务器软件&…

细化的 Spring Boot 和 Spring Framework 版本对应关系

注:本文由ai辅助,个人整理,有问题可留言 Spring Boot 3.x 系列 (基于 Spring Framework 6.x) Spring Boot 版本 对应的 Spring Framework 版本 Java 支持版本 3.1.5 (最新) 6.0.15 Java 17+ 3.1.4 6.0.14 Java 17+ 3.1.3 6.0.12 Java 17+ 3.1.2 6.0.11 Java 17+ 3.1.1 6.0.…

PyTorch API 1

文章目录torch张量创建操作索引、切片、连接与变异操作加速器生成器随机采样原地随机采样准随机采样序列化并行计算局部禁用梯度计算数学运算常量逐点运算归约操作比较运算频谱操作其他操作BLAS 和 LAPACK 运算遍历操作实用工具符号数字导出路径控制流优化方法操作符标签torch.…

基于FPGA的实时图像处理系统(2)——VGA显示彩条和图片

VGA显示彩条和图片 文章目录VGA显示彩条和图片一、VGA简介二、功能设计1、彩条设计2、图片设计三、结果展示四、代码一、VGA简介 VGA(Video Graphics Array)是IBM在1987年随PS/2机⼀起推出的⼀种视频,具有分辨率⾼、显⽰速率快、颜⾊丰富等优点,在彩 ⾊…

【网络运维】Linux 文本处理利器:sed 命令

Linux 文本处理利器:sed 命令 sed 简介 sed(Stream Editor)是一款非交互式的流编辑器,诞生于 1973–1974 年间的贝尔实验室,由 McMahon 开发。它专为文本处理而生,功能强大,是 Linux 文本处理常…

week2-[一维数组]出现次数

week2-[一维数组]出现次数 题目描述 给定 NNN 个整数A1,A2,…,ANA_1,A_2,\ldots,A_NA1​,A2​,…,AN​。请求出这 NNN 个数中出现次数最多的数的出现次数,以及出现次数最少的数的出现次数。 输入格式 读入包括 222 行。第一行只有 111 个整数 NNN,表示数…

力扣 hot100 Day79

215. 数组中的第K个最大元素 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 class…

C++围绕音视频相关的资料都有哪些?如何进行学习

音视频技术涉及的内容广泛而深入。我会根据自己的知识给你提供一个系统性的音视频相关资料梳理,主要分为学习路径与核心知识、开源项目与实战、开发者资源以及热点与趋势几个方面,希望能帮助你高效地学习和探索。 先用一个表格来概览主要的学习方向和资…

AI自动化测试,解决传统自动化测试中​​脚本维护成本高、用例覆盖不全、缺陷发现滞后​​等痛点

AI自动化测试,解决传统自动化测试中​​脚本维护成本高、用例覆盖不全、缺陷发现滞后​​等痛点AI自动化测试通过机器学习(ML)、自然语言处理(NLP)、计算机视觉(CV)等技术,解决了传统…

Laravel 事件与监听器

下面是一个完整的用户注册事件和监听器的实现示例,包含事件、监听器、注册、触发等完整流程。一、软件版本 php: 8.2.20laravel: 11mysql: 8.0.29 二、完整实现过程 1.创建事件 1.1 首先创建用户注册事件 php artisan make:event UserRegistered1.2 编辑app/Events/…

前端 React 实现数据懒加载-滚动触底加载数据

在 React 中使用 Intersection Observer API 实现触底加载分页&#xff08;无限滚动&#xff09;1.基本实现思路 在列表底部放置一个 哨兵元素&#xff08;Sentinel&#xff09;&#xff08;如 <div>&#xff09;。使用 IntersectionObserver 监听该元素是否进入视口&…

MySQL 50 道经典练习题及答案

目录 一、数据表设计与初始化 1. 数据表结构说明 2. 建表语句 3. 插入测试数据 二、练习题及答案 1. 查询 "01" 课程比 "02" 课程成绩高的学生的信息及课程分数 2. 查询同时存在 "01" 课程和 "02" 课程的情况 3. 查询存在 &qu…

电竞护航小程序搭建三角洲俱乐部护航派单小程序开发游戏派单系统定制开发

成品系统&#xff0c;可以快速搭建。功能概述&#xff1a;商家入驻、老板点单、快捷发单、自定义发单、发单列表、管事入驻、订单审核裁决、打手入驻、打手排行榜、邀请排行榜、账户充值、余额提现、成为客服等

MYSQL-增删查改CRUD

目录 &#x1f33f;前言&#xff1a; &#x1f33f;增-C-Create-新增 &#x1f9ca;单行数据全列插入 &#x1f34b;‍&#x1f7e9;语法&#xff1a; &#x1f34b;‍&#x1f7e9;演示&#xff1a; &#x1f9ca;指定列插入 &#x1f34b;‍&#x1f7e9;语法&#xf…

【Loss学习笔记】Focal loss、QFL、DFL、VFL——目标检测定位损失函数详解

文章目录Focal loss&#xff08;2018 ICCV &#xff0c;RetinaNet&#xff09;1、Focal Loss 提出背景问题一&#xff1a;正负样本数量不均衡问题问题二&#xff1a;难分类/易分类样本数量不均衡问题对两个问题的解决2、正负样本数量不均衡问题的解决&#xff1a;Focal loss 的…

nertctl使用了解

测试了几个容器&#xff0c;似乎未对k8s的containerd产生影响&#xff0c;都能访问 再次测试&#xff0c;containerd发生了重启&#xff0c;nrtdctl启动的容器都没了 #### sealos 创建containerd集群 sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.29…

三、k8s 1.29 之 资源清单

一、什么是资源 资源(Resources) 是指集群中可被分配、管理和调度的各种实体,既包括计算、存储、网络等基础设施资源,也包括 K8s 自身定义的 API 对象(如 Pod、Deployment 等)。这些资源是 K8s 调度和管理工作负载的核心基础。 Kubernetes 中的资源本质上是 “可被操作的…

React中常用的Hook(useEffect、useRef、useMemo、useNavigate、useParams)

React hook1&#xff1a;useEffect 在编程中&#xff0c;副作用是指函数或表达式在执行过程中对外部环境产生影响的行为。例如&#xff1a; 修改外部变量&#xff08;如全局变量、DOM、API 请求、设置定时器等&#xff09; 什么是纯函数&#xff1f; // 纯函数&#xff1a;输入…

关联规则挖掘1:Apriori算法

目录 一、Apriori算法核心原理 1. 基本概念 2. Apriori性质 二、完整案例计算&#xff08;超市购物数据&#xff09; ​步骤1&#xff1a;按字母序重排每笔交易​ ​步骤2&#xff1a;统计频繁1-项集&#xff08;min_support40%&#xff09;​​ ​步骤3&#xff1a;生成…