信息安全:软件认证(Authentication)

Perface

近些年,汽车新势力的强势入局,汽车行业,大有"百花齐放"的盛况。汽车行业的蓬勃发展,催生多种新技术的诞生和跨界使用,比如:软件认证功能(Software Authentication)。讨论的内容包括但不限于:1、软件Part创建 2、软件签名 3、软件下载与验证…

本系列话题讨论的几点内容如下所示:

在这里插入图片描述
Part One

本文讨论第一个点:软件Part创建(Create SW Part)

1、Create SW Part

创建软件Part示意如下所示:

图片

一个Software Part可以包含多个Data Blocks。这里解释一下Software Part和Data Blocks。

  • Software Part:软件块,比如:Application程序块、标定块(Calibration)等。
  • Data Blocks:软件被编译器编译后,并不连续,而是分段的。

可以用HexView打开编译后的可执行文件(本文:.hex),打开一个Application Part,对应的部分Data blocks如下所示:
图片

提示:实际的工程中,可能会将Block间的gap用指定填充值(eg:padding value = 0x00)进行填充,形成一个大的Block,以便于减少hash的计算。

为了验证下载的数据,需要清楚ECU每个Data Block在内存中的起始地址、长度、CRC等信息。对于需要认证的软件,Software Part除了Data block信息外,还会附加一个VBT(Verification Block Table),置于Data block后面。

一般来说,VBT会专门分配一个block,且Start Address确定。示意如下所示:
图片

2、VBT

VBT里面放置的是什么呢?

答:VBT就像一个清单列表(manifest),存储着Software Part里的每个Data Block信息,这些信息包括:起始地址、长度、Hash值等。

首先,对VBT签名(sign),对应的信息(start address、 length、 hash value)存储在"Header"中,其中root hash value是指对VBT的起始地址、长度、数据的计算结果。root hash value是程序最先比对的一个对象,如果root hash value验证不过,则之后的Data block的hash值不再比对。

注意,root hash的签名信息会通过上位机发送给ECU,常规做法:通过诊断
Routine Control service (0x31) 服务将签名信息下发给ECU,ECU使用已经存储的Public Key计算VBT对应的root hash value。签名信息包含在"Header"部分,如下所示:

图片

注意:签名信息又分为产品签和开发签。开发签主要在开发阶段使用,产品签主要用于产线。

VBT格式如下所示:

图片

这里我们先展开一下root hash的验证过程:

  • 当VBT刷写进ECU Memory以后,会调用HSM接口,根据VBT的StartAddress、Length、Data计算root hash(这里记为root_hash_1)。注意,此处的VBT Block和Data Block已通过Transfer Data service (0x36) 存储到ECU的指定 Memory;
  • 当ECU收到上位机发送的签名信息以后,根据签名信息再次调用HSM计算root hash(这里记为root_hash_2);
  • 如果root_hash_1 == root_hash_2,则VBT验证通过,之后进行后续的Data Block验证;否则,验证失败,即:刷写失败。

提示:

  • 每个Data Block的hash值仅是Data Block的Data计算结果;
  • VBT的hash值(root hash)是VBT对应的Start Address、Length、Data计算结果。

(一)VBT格式

VBT的格式如下所示:

图片

Hash value的长度与使用的Hash算法相关,比如:使用SHA-256,则Hash value = 256 bit = 32 Byte。
示例:一个Data Block,VBT的Data记录信息如下所示

图片

解析:

  • VBT Format Identifier = 0x0000;

  • Data Blocks的个数是0x0001;

  • Data Block1的Start Address = 0xA0300000,Leng = 0x000FC000,Hash Value = 0xD49C8F…173C。

这里的Format Identifier是企业规范,并不属于通用规范,比如:0x0000对应SHA-256、0x0001对应SHA-384、0x0002对应SHA-512等。此标识主要用于区分使用的SHA算法。

3、*.vbf文件处理时机

需求中,一般会要求:在生成VBT之前,Data block数据不要压缩(Compression)、加密(Encryption)、编码处理等。

这些动作需要在VBT生成之后进行,如下所示:
图片

Part Two

软件签名的大体流程如下所示:


这个流程中,有这样几个信息是本文所要讨论的:

  • Sign用到的算法有哪些
  • Private Key和Public Key关系

1、Sign用到的算法有哪些

1、SHA256

SHA256:Secure Hash Algorithm,安全散列算法。对任意长度的信息,SHA256均会生成一个长度256bit(32 Byte)的哈希值,这256Bit信息也称作摘要。软件认证中,主要用来对Data Block、VBT(Verification Block Table)生成Hash值,确保数据在通信过程中未被篡改,相比于常规的CRC算法,此方法的数据完整性和安全性校验更可靠。

数据完整性校验,除了使用SHA256算法,常见的其他算法有SHA-384、SHA-512等。

2、RSA2048

RSA2048:一种非对称成加密算法。收/发双方各有一组公钥(Public Key)和私钥(Private Key),RSA2048常用于密钥加密。

软件认证中常用的签名算法:SHA256_RSA2048。

加密算法,除了常用的RSA2048,还有RSA4096等。

2、Private Key与Public Key关系

软件认证中,公钥(Public Key)和私钥(Private Key)是成对出现的,即:Key-Pair,两者之间的关系和作用如下所示:


工程中,Public Key和Private Key一般固定长度,比如:2048 Bit(256 Byte)。

  • Private Key:对Software Part进行签名(加密)。

  • Public Key:对前面的Software Part进行解密。

既然用Public Key对Software Part进行解密,就需要提前将Public Key存储到ECU中。开发过程中,使用开发对应的Public Key(默认Key,eg:0xFFFFFFFFFF);当软件完成开发以后,会将Public Key存储到一个不可修改的位置,且只能写一次,写入位置可以是HSM,这个Public Key称为产品Public Key。

工程中,Public Key一般在升级过程中,提前通过Write Data By Identifier service(0x2E)写入指定位置。

1、Private Key对谁加密(签名)?

工程中,Private Key主要对Root Hash进行加密,即VBT对应的hash值进行加密。

2、Public Key对谁解密?

既然,Private Key是对Root Hash加密,那么对应的Public Key就是对Root Hash进行解密。解密后获取VBT的Root Hash Value(记为#1),之后ECU通过调用HSM接口,对已刷写进内存的VBT Block进行Root Hash Value(记为#2)计算。

通过对比Root Hash Value#1和Root Hash Value#2即可知道当前的VBT是否可信。如果不可信,即:Root Hash Value#1 ≠ Root Hash Value#2,说明当前的信息不安全,进而刷写失败。

参考资料

  • https://mp.weixin.qq.com/s?__biz=MzUyNDU4NTc1NQ==&mid=2247490561&idx=1&sn=cd3ad56c4d24b4474dd0e1cb2bb10a6a&chksm=fa2a4275cd5dcb63436b8f45ba9ad3d25b296bdbc246829456b1ea63625e817d02ff8e6014fe&scene=21#wechat_redirect
  • https://mp.weixin.qq.com/s?__biz=MzUyNDU4NTc1NQ==&mid=2247490586&idx=1&sn=2be4a4463af77a9e06b1d5e8234e2a32&chksm=fa2a426ecd5dcb7887cc052269b0a3aac3519e833fc3345629d8337529ccff8f4245fdd9ed6b&cur_album_id=2670421882604847110&scene=189#wechat_redirect
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值