车载信息安全之Secure Boot实现策略_vector secure boot-程序员宅基地

技术标签: AUTOSAR  非对称加密技术  对称加密技术  车载信息安全  Hash算法  信息安全  Secure boot  ADAS  

车载信息安全之Secure Boot实现策略

前言

开篇老规矩,”小T三问“,你是否清楚:

  • 车载信息安全的重要性体现在哪里?
  • Secure Boot的主要实现目的是什么?
  • Secure Boot常规的实现方案是怎样的?

这篇,我们来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲:

在这里插入图片描述


正文

在开始讲解安全启动(Secure Boot)之前,我们首先来简单认识以下为什么需要有车载信息安全?

为什么要有车载信息安全?

随着智能驾驶,智能座舱的不断发展,车内ECU也越来越集中化,网络化,ECU之间不单单可以直接通过以太网通信,同时也可以通过V2X技术与车外进行通信,车与车之间,车与外界之间联系越来越紧密,如此一来便无形之中给外界开了诸多与车辆通信的渠道。

比如我们最为常见的整车OTA技术,如果在行车过程中,ECU中运行的软件突然被黑客进行篡改或者控制,将会大大影响到行车安全,随着未来整车自动驾驶技术的不断发展,从L3到L4甚至到L5,人在驾驶方面起到的作用将会越来越小,此时整车的信息安全将会显得至关重要。

而整车信息安全的就在于整车各个智能控制ECU在启动阶段就做好相关的安全确认与校验,才能将风险及时控制住,如果在Runtime时候去检测,则可能会造成更大的行车安全问题。

因此,在车载信息安全领域,在各个智能ECU节点的启动阶段做好相应的安全检查技术,也就是我们所说的安全启动技术,即Secure Boot技术,毫无疑问便可以将各种黑客造成的篡改早早的扼杀在摇篮之中,从而保证最终各ECU中程序Runtime中的行车安全。

Secure Boot简介

应用背景

在芯片上运行的代码一般来说可能会面临两大类信心安全攻击风险:

  • 代码被恶意更改或者攻击;
  • 代码IP被非法读取活获取;

对于第一类风险,我们需要采用某种安全机制来确保芯片运行用户指定的程序,防止代码被恶意篡改;对于第二类风险,为了防止代码被盗,需要针对代码原文进行加密存储,在芯片启动过程中再进行解密后启动。

由于上述代码加密或者启动代码验证等方面都需要花费更多的CPU资源来完成这些工作,因此仅仅依靠传统CPU可能无法高效完成此类工作,需要引入与安全加密有关的单独硬件来做这方面工作,比如我们常说的HSM或者HSE等。

HSM或者SHE模块本质上来讲就是一种硬件加解密引擎,将这些特别耗时的任务交给专门的硬件模块来处理,一方面能够实现Secure boot需求,另一方面也能够提高程序启动效率。

一般来说,支持安全启动的芯片一般都会存在OTP区域(one time programable),其工作原理与保险丝一致,芯片再出厂后,该区域内所有的bit均为1,如果某个bit被烧写为0,就会彻底熔断该bit,再也无法改变该值,也就是再也无法更改为1了,一般该OTP区域用于存储用户的密钥信息。

当然有些芯片可能实现OTP的方式是通过某些控制寄存器来控制某些内存区域,通过控制这些控制寄存器无法被再次改写,从而间接完成被控制的内存区域具备OTP区域特性。

实现目标

具备安全特性如HSM的芯片加入到Secure boot功能之后,便会利用OTP区域内存储的用户密钥信息对即将加载的软件进行多级安全验证,从而最终建立起可靠的安全信任链,通过该安全启动信任链便可以完成软件信息安全的五大特性指标

  • 真实性:即软件版本未经过篡改;
  • 完整性:软件版本包含了开发者发布的所有内容,没有发生任何变化;
  • 时效性:软件版本是有效期间内的版本;
  • 不可抵赖性:软件发布后,发布者不能否认版本的所有权;
  • 机密性:软件版本不泄露给未授权的个人或实体,不能被非法盗取或者读取;
Secure Boot 相关密码学方法总结

在讲解Secure Boot实现策略之前,小T有必要跟大家一起先来了解下与Secure Boot有关的相关密码学基本方法,这样才能够更为彻底的理解为什么Secure Boot实现策略要这么来做才更加安全。

代码明文加密与对称加密算法

为了保护软件版本IP,防止代码被恶意串改,因此有必要针对软件版本进行加密处理,即针对代码明文进行加密处理。

AES作为一种较为常见的对称加密算法,具备应用范围广,相对容易隐藏,吞吐量高等优点,通常便可以用来做代码加密处理。

所谓对称加密算法就是加密,解密都是用的同一个密钥,如下图1所示,代码释放者可以将如下代码明文用AES加密算法加密成密文,然后将代码密文烧写到对应的存储芯片中,安全芯片HSM或HSE在启动过程中将加密后的代码密文加载到内存中,同时利用OTP区域中事先烧录的密钥进行代码解密,此时便可以发现整个解密过程用到了相同的密钥及相同算法的逆算法,从而通过解密将代码密文恢复成明文。

该AES对称加密技术的显著优势就是加解密速度快,特别适用于大数据量的加密存储。

在这里插入图片描述

图1-1 代码明文对称加密过程

在这里插入图片描述

图1-2 代码密文对称解密过程

信息摘要与哈希函数

哈希函数又称为哈希算法,是一种可以将任意长度的一组数据创建为定长的小的数字指纹的方法,该数字指纹也被称作为信息摘要,为了便于理解,后续统一以这种数字指纹称呼为信息摘要。

哈希函数用到的就是哈希变换,哈希变换具备如下两个典型的特征:

  • 加密过程不可逆:也就意味着任何人都无法根据信息摘要推算出加密前的明文到底是什么?
  • 一一对应性:输入的明文与信息摘要一一对应,绝对不会存在不同的明文哈希变换之后得到的信息摘要一样的情况。

在Secure Boot中,一般采用SHA哈希函数来实现哈希变换,来完成最终的信息摘要生成,比如最为常见的SHA256,即生成的信息摘要为32个Byte(Hash Value),如下图中Hash Value存在错误,应该为32个字节,以便用来校验代码的完整性,如下图2所示。

在这里插入图片描述

图2 哈希算法过程

信任链与非对称加密算法

在整个Secure Boot的过程中除了解决防止代码IP被意外获取之外,最为关键的还是要解决一个信任问题,所谓信任问题就是CPU加载的软件版本是软件发布者A发布的软件版本,而不是别人的非法软件版本。

要解决这类信任问题,就需要使用到非对称加密算法,所谓非对称加密算法就是该算法中存在两个密钥,一个是公钥,一个是私钥。它们是一对,如果用公钥进行加密,只有用对应的私钥才能进行解密,如果用私钥进行加密,也只有使用对应的公钥进行解密才行。

一般来说,密钥的长度越长,算法便会越安全,一般来说会使用非对称加密算法来解决上述信任问题,如RSA非对称加密算法。它是一种公开的、基于数学理论的加密算法,不依赖于任何机构或个人,也不容易被破解,可以实现数字签名与认证工作。

如下图3-1所示,在如下的安全启动过程中软件版本发布者A可以使用RSA私钥来实现对代码的信息摘要进行加密处理,生成数字签名;然后芯片端则可以使用对应的公钥来对数字签名进行解密,从而来完成版本的真实性,同时一旦验证成功,则也具备不可抵赖性,因为只有软件版本发布者A才具有私钥,如图3-2所示:

在这里插入图片描述

图3-1 私钥加密生成数字签名过程

在这里插入图片描述

图3-2 公钥解密还原信息摘要过程

公钥信息交互与数字证书

除了上述解释软件版本自身的信任问题,还需要确保密钥信息自身传输过程的安全性与保密性,此时就需要建立一套完备的信任机制来完传递密钥。

数字证书就是一种权威性的文档,由证书签发机关(CA)签发的对用户公钥的认证,也就是我们常说的"根证书"。 证书一般包含如下几个方面的内容:

  • 电子签证机关的信息;
  • 公钥用户信息;
  • 公钥;
  • 有效期和数字签名等;

一般来说,该数字证书的格式跟验证方法需遵循X.509国际标准。

Secure Boot实现策略

至此,与车载信息安全Secure Boot有关的密码学方法到此基本就介绍完毕了,想必大家应该对secure boot为什么要使用这些密码学方法有了更为清晰的认识,接下来我们将重点来讲解Secure Boot如何利用上述密钥学方法实现如下两个方面的内容:

  • 安全镜像生成流程:该流程主要介绍通过密码学相关方法能够生成供芯片端正确识别的合法软件版本,防止非法软件被意外启动;
  • 安全镜像启动流程:该流程主要介绍通过密码学相关方法来完成针对软件版本的多层安全校验机制如何进行实施;

整个安全启动版本需要校验的文件主要包含如下两个部分:

  • 符合X.509格式的数字证书或根证书;

  • 用户软件版本;

安全镜像生成流程

如下图4所示,整个安全镜像文件生成包含如下几个基本步骤:

S1:用户使用AES加密算法来实现将代码明文转换为密文,同时用户也需要提前在芯片端OTP区域烧录该AES密钥;

S2:用户需采用SHA256哈希函数来对代码密文进行哈希运算,最终得到该软件版本密文的信息摘要;

S3:用户需生成符合X.509国际标准的数字证书或者根证书文件,该文件中需包含上述软件版本密文的信息摘要与RSA公钥信息;

S4:用户需采用SHA256哈希函数来对上述数字证书做哈希运算,得到数字证书的信息摘要,同时用户使用RSA私钥对该信息摘要进行加密处理,最终得到该用户的数字签名。

在这里插入图片描述

图4 安全镜像生成全流程

安全镜像启动流程

如下图5所示,较为详细的展示了安全启动流程中的多级安全校验机制,从而保证最终的软件的安全性,合法性与完整性。

S1:芯片复位启动后,通过硬件加密模块如HSM或者HSE先对烧录在Flash中的X.509标准数字证书公钥信息进行哈希运算,并与提前烧录到芯片OTP区域的公钥哈希值进行比对,如果结果一致,那么则可以确认公钥的合法性,这个就是整个信息安全信任链的第一个环节,也是十分重要的环节;

S2:公钥合法性确认后,硬件加密模块如HSM或HSE再利用数字证书的数字签名进行用户合法性鉴权。具体操作步骤就是通过上述确认的公钥对数字签名进行解密处理得到证书的哈希值,同时针对存储在Flash芯片上的证书重新进行哈希运算,对比两个哈希值是否一致,如果一致,则鉴权成功,合法性得到了保障;

S3:然后再利用硬件加密模块如HSM或HSE来重新计算Flash芯片上存储的软件版本的哈希值,即信息摘要,并与数字证书的信息摘要进行比对确认是否一致,如果匹配则说明代码没有被恶意篡改, 用户软件版本的完整性与安全性得到了保障;

S4:芯片硬件加密模块如HSM或HSE最终利用OTP区域提前存储的AES对代码进行解密处理,从而得到代码明文,最终便可以正常加载到CPU中启动运行。

注意:上述任意一个流程没有通过,将不会进行后续流程的校验,则停留在当前的Boot中。

在这里插入图片描述

图5 安全镜像启动全流程

由于Secure Boot想必传统的Boot而言,增加了多重安全校验机制,毫无疑问会增加代码启动时间,从而因此第一帧报文发出过晚,因此需要权衡并优化。针对这类问题在具体项目实施过程中与上述流程可能允许存在些许差异,常见的一些差异表现如下:

  • 比如数字证书的公钥信息提取在上位机已成功提取,无需软件来做,减少启动时间;

  • 软件代码的AES加解密措施有些项目考虑到启动时间问题可能也会省略,这个具体还是要看项目端具体需求;
    Boot而言,增加了多重安全校验机制,毫无疑问会增加代码启动时间,从而因此第一帧报文发出过晚,因此需要权衡并优化。针对这类问题在具体项目实施过程中与上述流程可能允许存在些许差异,常见的一些差异表现如下:

  • 比如数字证书的公钥信息提取在上位机已成功提取,无需软件来做,减少启动时间;

  • 软件代码的AES加解密措施有些项目考虑到启动时间问题可能也会省略,这个具体还是要看项目端具体需求;

  • 不同供应商使用的Secure Boot流程与上述流程可能均存在差异,这个依照各个项目而定,本文只是提供了一般性的Secure Boot实现策略。

更多精彩内容,欢迎大家多多关注公众号"ADAS与ECU之吾见"!!!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wto9109/article/details/134724173

智能推荐

JWT(Json Web Token)实现无状态登录_无状态token登录-程序员宅基地

文章浏览阅读685次。1.1.什么是有状态?有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session。例如登录:用户登录后,我们把登录者的信息保存在服务端session中,并且给用户一个cookie值,记录对应的session。然后下次请求,用户携带cookie值来,我们就能识别到对应session,从而找到用户的信息。缺点是什么?服务端保存大量数据,增加服务端压力 服务端保存用户状态,无法进行水平扩展 客户端请求依赖服务.._无状态token登录

SDUT OJ逆置正整数-程序员宅基地

文章浏览阅读293次。SDUT OnlineJudge#include<iostream>using namespace std;int main(){int a,b,c,d;cin>>a;b=a%10;c=a/10%10;d=a/100%10;int key[3];key[0]=b;key[1]=c;key[2]=d;for(int i = 0;i<3;i++){ if(key[i]!=0) { cout<<key[i.

年终奖盲区_年终奖盲区表-程序员宅基地

文章浏览阅读2.2k次。年终奖采用的平均每月的收入来评定缴税级数的,速算扣除数也按照月份计算出来,但是最终减去的也是一个月的速算扣除数。为什么这么做呢,这样的收的税更多啊,年终也是一个月的收入,凭什么减去12*速算扣除数了?这个霸道(不要脸)的说法,我们只能合理避免的这些跨级的区域了,那具体是那些区域呢?可以参考下面的表格:年终奖一列标红的一对便是盲区的上下线,发放年终奖的数额一定一定要避免这个区域,不然公司多花了钱..._年终奖盲区表

matlab 提取struct结构体中某个字段所有变量的值_matlab读取struct类型数据中的值-程序员宅基地

文章浏览阅读7.5k次,点赞5次,收藏19次。matlab结构体struct字段变量值提取_matlab读取struct类型数据中的值

Android fragment的用法_android reader fragment-程序员宅基地

文章浏览阅读4.8k次。1,什么情况下使用fragment通常用来作为一个activity的用户界面的一部分例如, 一个新闻应用可以在屏幕左侧使用一个fragment来展示一个文章的列表,然后在屏幕右侧使用另一个fragment来展示一篇文章 – 2个fragment并排显示在相同的一个activity中,并且每一个fragment拥有它自己的一套生命周期回调方法,并且处理它们自己的用户输_android reader fragment

FFT of waveIn audio signals-程序员宅基地

文章浏览阅读2.8k次。FFT of waveIn audio signalsBy Aqiruse An article on using the Fast Fourier Transform on audio signals. IntroductionThe Fast Fourier Transform (FFT) allows users to view the spectrum content of _fft of wavein audio signals

随便推点

Awesome Mac:收集的非常全面好用的Mac应用程序、软件以及工具_awesomemac-程序员宅基地

文章浏览阅读5.9k次。https://jaywcjlove.github.io/awesome-mac/ 这个仓库主要是收集非常好用的Mac应用程序、软件以及工具,主要面向开发者和设计师。有这个想法是因为我最近发了一篇较为火爆的涨粉儿微信公众号文章《工具武装的前端开发工程师》,于是建了这么一个仓库,持续更新作为补充,搜集更多好用的软件工具。请Star、Pull Request或者使劲搓它 issu_awesomemac

java前端技术---jquery基础详解_简介java中jquery技术-程序员宅基地

文章浏览阅读616次。一.jquery简介 jQuery是一个快速的,简洁的javaScript库,使用户能更方便地处理HTML documents、events、实现动画效果,并且方便地为网站提供AJAX交互 jQuery 的功能概括1、html 的元素选取2、html的元素操作3、html dom遍历和修改4、js特效和动画效果5、css操作6、html事件操作7、ajax_简介java中jquery技术

Ant Design Table换滚动条的样式_ant design ::-webkit-scrollbar-corner-程序员宅基地

文章浏览阅读1.6w次,点赞5次,收藏19次。我修改的是表格的固定列滚动而产生的滚动条引用Table的组件的css文件中加入下面的样式:.ant-table-body{ &amp;amp;::-webkit-scrollbar { height: 5px; } &amp;amp;::-webkit-scrollbar-thumb { border-radius: 5px; -webkit-box..._ant design ::-webkit-scrollbar-corner

javaWeb毕设分享 健身俱乐部会员管理系统【源码+论文】-程序员宅基地

文章浏览阅读269次。基于JSP的健身俱乐部会员管理系统项目分享:见文末!

论文开题报告怎么写?_开题报告研究难点-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏15次。同学们,是不是又到了一年一度写开题报告的时候呀?是不是还在为不知道论文的开题报告怎么写而苦恼?Take it easy!我带着倾尽我所有开题报告写作经验总结出来的最强保姆级开题报告解说来啦,一定让你脱胎换骨,顺利拿下开题报告这个高塔,你确定还不赶快点赞收藏学起来吗?_开题报告研究难点

原生JS 与 VUE获取父级、子级、兄弟节点的方法 及一些DOM对象的获取_获取子节点的路径 vue-程序员宅基地

文章浏览阅读6k次,点赞4次,收藏17次。原生先获取对象var a = document.getElementById("dom");vue先添加ref <div class="" ref="divBox">获取对象let a = this.$refs.divBox获取父、子、兄弟节点方法var b = a.childNodes; 获取a的全部子节点 var c = a.parentNode; 获取a的父节点var d = a.nextSbiling; 获取a的下一个兄弟节点 var e = a.previ_获取子节点的路径 vue

推荐文章

热门文章

相关标签