汽车ECU实现数据安全存储的一种方案

一、 综述

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

二、方案

2.1 方案概述

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

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

  • 密钥派生算法:本项目使用PBDKF2。
  • 种子:可使用多种形式的种子或互相结合形成种子
    1.保存在DFlash中的随机数
    2.硬编码在代码中的固定值
    3.读取芯片特征值,例如芯片ID

本文档后续以“硬编码在代码中的固定值”作为种子进行举例。若使用其他种子,只需对应扩展即可
在这里插入图片描述

2.2 保护密钥生成

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

  1. 通过硬编码在源代码中的第一处种子,使用密钥派生算法PBKDF2-HMAC-SHA256生成32字节的派生密码;
  2. 以步骤1中生成的派生密码和硬编码在第二处的种子为基础,使用密钥派生算法PBKDF2-HMAC-SHA256进行运算,得到32字节的派生密码;
  3. 以步骤2中生成的派生密码和硬编码在第三处的种子为基础,使用密钥派生算法PBKDF2-HMAC-SHA256进行运算,得到32字节的派生密码,即为最终的保护密钥;

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

在这里插入图片描述

2.3 初始化

实际项目中可能存在业务密钥分默认密钥和生产密钥的情况:

  • 默认密钥:在供应商产线即注入,通常为一个特定值,例如全0xFF或全0x00。
  • 生产密钥:在OEM产线注入,例如通过UDS 2E服务的某个DID。

2.3.1 初始化准备

定义一个结构体,应包含两个值:

  • 业务密钥:用于存储业务密钥明文或密文,长度应为16的整数倍(AES算法填充导致)。
  • 标志位:用于表明当前业务密钥是明文还是密文存储。
    示例结构体如下:
struct bussiness_info {unsigned int flag;//0:明文存储,1:密文存储unsigned char bu_key[32];//具体长度需结合实际业务密钥确定,请注意AES加密需填充,故加密后的值必然为16的整数倍
}

2.3.2 默认密钥初始化

默认密钥在FLASH中进行明文存储。故在供应商产线只需将bu_key置为规范中的特定值,flag置为0。
在产品进入OEM产线前,业务密钥均明文存储和使用。

2.3.3 生产密钥初始化

生产密钥通常通过UDS 2E服务的DID在OEM产线进行写入。当通过DID进行写入时,需在写入处理程序中添加加密初始化过程,加密初始化流程如下:

  1. 接收OEM产线传入的明文业务生产密钥;
  2. 调用2.2中的保护密钥生成函数,获得保护密钥;
  3. 将步骤1中接收到的业务生产密钥明文,通过AES-256-CBC加密算法使用保护密钥,得到业务生产密钥密文;
  4. 构建结构体,其中flag为1,bu_key为步骤3得到的业务密钥密文。并将此结构体覆盖写入默认密钥结构体所在位置(确保覆盖默认密钥所在结构体)。

在这里插入图片描述

2.4 运行阶段

当需要使用业务密钥进行业务处理时,应进行如下流程:

  1. 从FLASH上读取初始化阶段保存的结构体struct bussiness_info,判断flag值,若为0,则表明当前使用默认密钥,故直接读取结构体中bu_key的值作为业务密钥使用(需注意默认密钥长度);
  2. flag值为1,则当前使用的为正式密钥,读取结构体中bu_key的值为密文,需进行解密;
  3. 调用2.2中保护密钥生成函数,获取保护密钥;
  4. 以读取的bu_key密文为输入,通过AES-256-CBC算法使用保护密钥,获得业务生产密钥明文;
  5. 销毁保护密钥;
  6. 生成的业务生产密钥保存在内存中,并在业务中使用。

在这里插入图片描述

2.5 完整过程

结合初始化阶段和运行阶段,形成完整的密钥保护工作流程,如下图:

在这里插入图片描述

三、优化

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

四、算法

4.1 AES算法

本方案对业务密钥进行加解密的算法为AES-256,使用CBC模式。CBC的IV可预定义好,并在代码中硬编码。

4.2 PBKDF2算法

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

PBKDF2算法涉及参数如下:

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

五、扩展

在前面章节的示例中,采用的是硬编码种子的方式。实际项目中种子的选择具有多样性,可采取多种方式选择种子。例如:
1.种子1是硬编码的固定值,种子2为随机数。种子2存储在DFLASH中,当进行2.3.3章节的初始化过程时,由随机数生成器生成并存储在DFLASH中,后续使用时直接读取即可。
2.种子1和种子2都是硬编码的固定值,种子3来自芯片ID。大多数芯片都有一个唯一且固定的序列号,可以读取此序列号作为种子使用。
实际使用时,应考虑具体需求,再确定种子。若需要一机一密,则有种子是随机数或者芯片序列号。若对稳定性要求高,则尽量选择硬编码种子。

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

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

相关文章

十进制数到十六进制数的转换

十进制数x,若能表示为,n为大于等于0的整数。ni4j。i取值为0、1、2和3。综合i和j,若i为0,则该16进制数为1后面加j个0;若i为1,则该16进制数为2后面加j个0;若i为2,则该16进制数为4后面加…

基于YoloV11+PaddleOCR的车牌检测系统

文章目录 一、CCPD数据集进行处理1.1 从文件夹构建txt格式数据集1.2 运行脚本按照8:2划分训练集,测试集 二 、YOLOV11训练模型2.1 编写car_plate.yaml文件2.2 编写train脚本:2.3 训练过程 三、PaddleOCR识别车牌号3.1 安装paddleocr&#xff…

2月12日鸿蒙生态日日新PLOG,多款应用上架

2月12日鸿蒙生态日日新PLOG :北京医院挂号通、有度、远光商旅等多款应用上架;钉钉、得到、航班管家等多款重点应用功能更新。 ​​​

Python----PyQt开发(PyQt高级:手搓一个简单的记事本)

一、效果展示 二、设计PyQt界面 2.1、设置图标 self.setWindowIcon(QIcon(./images/icon/1.png)) # 窗口图标 2.2、设置标题 self.file_name 无标题-新建文本文档 # 默认文件名 self.setWindowTitle(self.file_name) # 窗口标题 2.3、添加菜单栏、工具栏、状态栏 # 创…

Java 大视界 -- 大数据伦理与法律:Java 技术在合规中的作用与挑战(87)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

什么是AI Agent、Chat、RAG、MoE

什么是AI Agent、Chat、RAG、MoE 目录 什么是AI Agent、Chat、RAG、MoE定义与原理功能特点应用场景AI Agent有哪些关键组成部分感知模块决策模块知识模块行动模块学习模块AI Agent、Chat、RAG、MoE是人工智能领域中不同的概念和技术,它们在功能、原理和应用等方面存在一些区别…

在 debian 12 上安装 mysqlclient 报错

报错如下 Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Collecting mysqlclientUsing cached https://pypi.tuna.tsinghua.edu.cn/packages/61/68/810093cb579daae426794bbd9d88aa830fae296e85172d18cb0f0e5dd4bc/mysqlclient-2.2.7.tar.gz (91 kB)Installi…

自反馈与流量震荡:从 TCP/IP 路由到交通导航

为什么不能基于流量或时延做路由度量,而不仅仅基于跳数。原因在于这里存在一个自反馈: 路由决策导致流量变化;时延由流量变化而变化;流量时延影响路由决策。 当某条链路流量减少时,路由协议会将其度量调低&#xff0…

Jtti:centos主机如何搭建lnmp环境

在 CentOS 主机上搭建 LNMP(Linux Nginx MySQL/MariaDB PHP)环境是构建高性能 Web 服务器的常见选择。以下是搭建 LNMP 环境的详细步骤: 步骤 1: 更新系统 首先,更新系统的包列表和安装的包,以确保你的系统是最新的: sudo y…

如果需要保护多个域名怎么办?

随着企业和个人在网上的存在越来越重要,管理和保护多个域名变得尤为关键,那么如果需要保护这些域名,应该采取什么样的措施呢? 许多企业会选择注册与其品牌相关的不同后缀,或者与其产品、服务相关的域名。这不仅可以防…

从Sora到有言:3D视频生成技术的突破与应用

近年来,AIGC领域飞速发展,这个词也越来越高频地出现在了大家的生活中。AIGC 能完成的任务也越来越多,大模型的能力飞速增长 —— 从Deepseek生成文字,到StableDiffusion生成图像,再到Sora可以生成视频。 而现在&#x…

Apollo 9.0 控制算法 -- lon based pid controller

文章目录 1. 纵向控制算法1.1 算法结构1.1.1 外环:位置环1.1.2 内环:速度环 1.2 参数整定 2. 代码解析2.1 控制器初始化 LonController::Init()2.1.1 PID控制参数和标定表参数加载2.1.2 PID控制器初始化2.1.3 超前/滞后控制器初始化2.1.4 俯仰角滤波器初…

【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter12-BOM

十二、BOM 虽然 ECMAScript 把浏览器对象模型(BOM,Browser Object Model)描述为 JavaScript 的核心,但实际上 BOM 是使用 JavaScript 开发 Web 应用程序的核心。BOM 提供了与网页无关的浏览器功能对象。 HTML5 规范中有一部分涵盖…

Qt信号槽调用出错:Qt: Dead lock detected while activating a BlockingQueuedConnection

目录 1.现象和原因分析 2. 总结 1.现象和原因分析 就在最近的开发过程中,程序一运行在控制台就打印: Qt: Dead lock detected while activating a BlockingQueuedConnection: 咋一看,怎么出现死锁了呢?仔细看下…

Jenkins项目CICD流程

Jenkins项目流程:1.配置git环境 git config --...2.把前后端的目录初始化位本地工作目录 #git init3.提交到本地git #git add ./ git commit -m "" git tag v14.然后提交到远程git(通过,用户,群组,项目,管理项目)git remote add origin http://...git push -…

Springboot_实战

项目开发 lombok使用 自动为实体类提供get、set、toString方法 引入依赖 实体类上添加注解 统一响应结果 注意要写get、set方法;下面是错误的,因此要加上Data注解 一个注册的接口的示例 Controller层 Service层 Mapper层 参数校验 但是同样存在一…

C++自研游戏引擎-碰撞检测组件-八叉树AABB检测算法实现

八叉树碰撞检测是一种在三维空间中高效处理物体碰撞检测的算法,其原理可以类比为一个管理三维空间物体的智能系统。这个示例包含两个部分:八叉树部分用于宏观检测,AABB用于微观检测。AABB可以更换为均值或节点检测来提高检测精度。 八叉树的…

Spring框架中都用到了哪些设计模式?

大家好,我是锋哥。今天分享关于【Spring框架中都用到了哪些设计模式?】面试题。希望对大家有帮助; Spring框架中都用到了哪些设计模式? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring框架中使用了大量的设计模…

Day1 25/2/14 FRI

【一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解(马士兵)】https://www.bilibili.com/video/BV13g41157hK?p3&v…

软考高级《系统架构设计师》知识点(一)

计算机硬件 校验码 码距:就单个编码A:00而言,其码距为1,因为其只需要改变一位就变成另一个编码。在两个编码中,从A码到B码转换所需要改变的位数称为码距,如A:00要转换为B:11,码距为2。一般来说,…