首页 > 编程语言 >MCU基于非对称算法的伪安全启动方案

MCU基于非对称算法的伪安全启动方案

时间:2023-07-24 19:12:57浏览次数:41  
标签:HASH 启动 APP1 安全 算法 签名 镜像 MCU 非对称

一、概述

随着软件定义汽车理念的普及,汽车上代码量不断膨胀,功能不断智能化,用户体验不断升级。从传统汽车不需要联网,到职能汽车具有联网功能已是标配,汽车触网必将带来更多信息安全问题。汽车的信息安全问题比IT领域更加重要,因为可能危及生命安全。故国家也出台强标《汽车整车信息安全技术要求》(目前还处于征求意见稿),在强标的的9.1.1条提出

“车载软件升级系统应具备安全启动的功能,应保护车载软件升级系统的可信根、引导加载程序、系统固件不被篡改,或被篡改后无法正常启动”

故安全启动功能后续将成为强标的一部分,具有OTA功能的ECU都必须配备。但目前,MCU普遍未实用HSM功能,国内MPU总体支持安全启动。MCU未使用HSM,主要还是出于成本考量,实用HSM将带来物料成本和HSM协议栈成本。因此综合考量后,可以先解决有无问题,后续再解决好坏问题。在不增加额外成本的场景下,先解决有无问题,故提出一个基于非对称加密算法、信任链不完整的安全启动方案。

二、安全启动概念

安全启动是通过一项技术,确保按照固定顺序,运行经过验证后的代码,确保不会存在模块被绕过以及不会运行不合法的代码。通过此技术,可确保攻击者篡改任何ECU代码或者重新刷入非法代码都会被识别,且可以直接限制ECU启动。
安全启动涉及如下概念:

  1. 验证:一个检查过程,检查即将运行的代码是否为官方发布。为实现验证过程,需引入密码学算法,当官方发布软件包时,通过该算法计算出当前软件包的一个特定值,并将该特定值和软件包一起写入到ECU FLASH中。启动时,实时计算出软件包特征值,并和已写入FLASH的特征值对比。若两者一致,则软件包合法,否则不合法安全启动。
  2. 信任根:上述认证过程同样需通过代码实现,若攻击者可修改验证过程代码,则依然可绕过验证过程或篡改验证结果。故此时需要有一个攻击者完全无法修改的代码,来验证上述的认证代码,确保上述验证代码无法被修改。这个攻击者完全无法修改的代码即可理解为信任根,信任根是一致认为无法被篡改的一段代码,通常通过硬件实现,例如芯片的bootROM,bootROM是固化在芯片内的一段代码,芯片一旦制造完成,bootROM就用于无法被更改。
  3. 信任链:一个ECU的软件基本会分为多个部分,例如bootloader,app等,以信任根为起点,通过不断实现一级一级的验证,从而形成信任链,确保各模块认证的有效性。例如bootROM认证bootloader,bootloader认证app。

三、安全启动方案

3.1 根证书

安全启动采用非对称算法,可使用RS或ECC算法,生成一对公私钥。公私钥用途如下:

  • 私钥:用于签名,在刷写前,对即将发布的镜像计算HASH值,并通过私钥对HASH值进行签名,得到签名信息。
  • 公钥:用于验签,当安全启动工作时,通过对签名信息使用公钥验签,还原出发布时镜像的HASH值,用于后续比对HASH值是否正确。

3.2 存储空间

假定一个ECU软件包包括三部分,分别为BootLoader、APP1、APP2,则该软件包刷写到ECU FLASH中应是如下示例:

在原始镜像基础上,增加针对该镜像的签名信息,并将原始镜像和签名信息一同刷写到FLASH中。

3.3 刷写前准备

当进行软件刷写前,需先计算各模块的签名信息。计算签名信息流程如下:

  1. 基于原始镜像,使用HASH算法(例如SHA-256),得到该镜像的HASH值。
  2. 使用之前生成的私钥对HASH值进行签名,输出即为原始镜像的签名信息。
    当进行刷写时,需将原始镜像和签名信息一并刷写到FLASH中。例如参考3.2中示例,将BootLoader原始镜像和Bootloader签名信息刷写到BootLoader区域,将APP1原始镜像和APP1签名信息刷写到APP1区域。签名信息在各自区域存放的位置,可由开发人员自行定义,只需保障启动时,可准确读取到签名信息即可。
    将安全启动证书/公钥刷写到FLASH中,且将证书/公钥的HASH值保存到OTP中。

3.4 安全启动流程

3.4.1 总体安全启动流程

  1. bootrom后跳转到Bootloader,在Bootloader中验证根证书、bootloader自身、下一个启动模块的合法性。
  2. 启动bootloader下一个模块(例如APP1),在此模块中,验证后续启动模块的合法性。按照在当前模块中验证下一模块合法性,验证通过后,则继续启动下一模块的链路验证下去,直到所有模块都验证结束。
  3. 若验证失败,则跳转到启动失败处理流程:记录失败原因和失败次数到FLASH中,进行软件reset。

3.4.2 安全启动流程实例

假定一个ECU软件包包括三部分,分别为BootLoader、APP1、APP2。则启动过程如上图所示,具体流程如下:

  1. 上电后,执行芯片bootrom后,跳转到bootloader。首先读取DFLASH中失败次数,若失败次数大于N此(通常为3),则启动失败,停留在PBL中或提供有限功能(具体应依据项目需求设计)。若小于N,则继续启动流程;
  2. 读取安全启动根证书/公钥,计算HASH值(称为CERT-HASH-1),并读取OTP中保存的HASH值(称为CERT-HASH-2),比较CERT-HASH-1和CERT-HASH-2值是否相等,若相等,则根证书/公钥未被篡改,继续启动流程。若不相等,则启动失败,记录失败原因和次数到FLASH中,并进行reset,跳转到步骤1中;
  3. 随后读取Bootloader镜像并计算镜像的HASH值(称为BOOTLOADER-HASH-1)。读取bootloader的签名信息,并通过根证书/公钥验签bootloader的签名信息,得到签名信息中包含的HASH值(称为BOOTLOADER-HASH-2)。比较BOOTLOADER-HASH-1和BOOTLOADER-HASH-2值是否相等,若相等,则证明Bootloader未被篡改,继续启动流程。若不相等,则启动失败,记录失败原因和次数到FLASH中,并进行reset,跳转到步骤1中;
  4. 读取APP1镜像并计算镜像的HASH值(称为APP1-HASH-1)。读取APP1的签名信息,并通过根证书/公钥验签APP1的签名信息,得到签名信息中包含的HASH值(称为APP1-HASH-2)。比较APP1-HASH-1和APP1-HASH-2值是否相等,若相等,则证明APP1未被篡改,继续启动流程。若不相等,则启动失败,记录失败原因和次数到FLASH中,并进行reset,跳转到步骤1中;
  5. 跳转到APP1中。读取APP2镜像并计算镜像的HASH值(称为APP2-HASH-1)。读取APP2的签名信息,并通过根证书/公钥验签APP2的签名信息,得到签名信息中包含的HASH值(称为APP2-HASH-2)。比较APP2-HASH-1和APP2-HASH-2值是否相等,若相等,则证明APP2未被篡改,继续启动流程。若不相等,则启动失败,记录失败原因和次数到FLASH中,并进行reset,跳转到步骤1中;
  6. 跳转到APP2中。若有其他模块启动,则继续按照信任链一步一步进行验证。若无其他模块,则安全启动完成。

3.5 安全启动耗时

安全启动相较于普通启动,增加相应的流程,必然会带来安全启动时间的增加。基于在infineon TC377和TI AWR 2944经验,不借助硬件加速,耗时估算如下:

  • HASH使用SHA256:4K/1ms
  • 签名验签:9ms
    总体来说,耗时主要在对各模块计算HASH中,如APP有4M,则耗时将达到1S。

3.5.1 优化

针对HASH耗时较大,若芯片支持硬件CRC加速,可先计算镜像的CRC,然后对CRC进行签名。基于目前经验,硬件CRC速度约为70K/s,速度提升快20倍。以4M模块计算,使用硬件CRC耗时约58ms,使用软件HASH则耗时1000ms。
使用CRC碰撞概率远大于HASH(SHA-256)碰撞概率,故使用CRC可提升安全启动速度,但同步会带来安全性减弱。

四、方案总结

4.1 优点

在不大量增加成本的情况下,实现安全启动从无到有。使用当前方案,不需要使用支持HSM的芯片,不需要额外购买HSM协议栈,即可实现具有安全启动。

4.2 缺点

不是完整的安全启动。当前方案以BootLoader为信任根,而不是以不可更改代码为信任根。导致攻击者可修改BootLoader即可绕过安全启动的验证过程。

4.2.1 缺点完善

当前缺点为bootloader不是不可更改的区域,作为信任根强度不够。为提升强度,可限制对Bootloader的修改,例如:不允许刷写bootloader、禁用JTAG等调试口等措施。

标签:HASH,启动,APP1,安全,算法,签名,镜像,MCU,非对称
From: https://www.cnblogs.com/tridentj/p/17578071.html

相关文章

  • JavaScript数据结构和算法简述——数组
    为什么先讲数组数据结构可以简单的被分为线性结构和非线性结构。线性结构大致包括:数组(连续存储);链表(离散存储);栈(线性结构常见应用,由链表或数组增删和改进功能实现);队列(线性结构常见应用,由链表或数组增删和改进功能实现);非线性结构大致包括:树;图;其中,数组是应用最广泛的数据存储结构。它被......
  • 第二届粤港澳大湾区(黄埔)国际算法算例大赛正式开启报名
    据悉,2023第二届“粤港澳大湾区(黄埔)国际算法算例大赛”(以下简称“大赛”)已于7月15日正式开赛。粤港澳大湾区(黄埔)国际算法算例大赛是受广州市黄埔区政府委托,由琶洲实验室(黄埔)于2022年创办的算法算例领域国际性赛事。旨在通过发挥实验室在数字经济领域的引领和带动作用,推动大湾......
  • 【智能优化算法】基于黄金莱维引导机制的阿基米德优化算法(MSAOA)求解单目标优化问题
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • R语言社区发现算法检测心理学复杂网络:spinglass、探索性图分析walktrap算法与可视化|
    原文链接:http://tecdat.cn/?p=24613最近我们被客户要求撰写关于社区发现算法的研究报告,包括一些图形和统计输出。我们在心理学网络论文中看到的一个问题是,作者有时会对其数据的可视化进行过度解释。这尤其涉及到图形的布局和节点的位置,例如:网络中的节点是否聚集在某些社区 ( ......
  • 基于KNN近邻分类的情感识别算法matlab仿真
    1.算法理论概述      情感识别是自然语言处理领域中的一个重要研究方向。本文介绍了一种基于KNN近邻分类的情感识别算法,该算法使用词袋模型提取文本特征向量,计算文本特征向量之间的距离,并使用加权投票的方法确定待分类文本的情感类别。本文详细介绍了算法的数学模型和实现......
  • 【BP分类】基于遗传算法优化BP神经网络的数据分类附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 代码随想录算法训练营第三十六天| 198.打家劫舍 213.打家劫舍II 337.打家劫舍III
     198.打家劫舍 要求:给定一个nums,要求取得最大值,但是不可以选择两个相邻的数dp定义:dp[n],取到第N个数字的时候,最大值递推公式:取:nums[i]+dp[j-2]不取:nums[i-1];代码:1//在两个数字不相邻的情况下,得到的最大金额2//思路:3//dp[n]第N个数字时的最大金额数4......
  • 基于mnist手写数字数据库识别算法matlab仿真,对比SVM,LDA以及决策树
    1.算法理论概述      基于MNIST手写数字数据库识别算法,对比SVM、LDA以及决策树。首先,我们将介绍MNIST数据库的基本信息和手写数字识别的背景,然后分别介绍SVM、LDA和决策树的基本原理和数学模型,并对比它们在手写数字识别任务中的性能。 1.1、MNIST手写数字数据库   ......
  • 协同过滤算法java
    协同过滤算法及其在Java中的应用协同过滤算法是一种常用的推荐系统算法,通过分析用户行为和偏好,找出用户之间的相似性,从而向用户推荐相关的物品或内容。本文将介绍协同过滤算法的原理,并使用Java语言实现一个简单的协同过滤算法示例。协同过滤算法原理协同过滤算法基于一个假设:如......
  • 文本指纹算法 Java工具
    文本指纹算法Java工具1.什么是文本指纹算法文本指纹算法(TextFingerprintingAlgorithm)是一种用于比较和识别文本相似度的算法。它的原理是将文本转换为一串短的二进制序列,即文本指纹,通过比较文本指纹的相似度来判断文本的相似程度。文本指纹算法在文本比较、文本搜索、版权保......