作者:梦魇漂鸟的心之一方老窝 | 来源:互联网 | 2023-08-11 19:24
一、Secure Boot概述
1、相关术语
- Secure boot:安全启动
- efuse:一次性可编程熔丝技术。有些SoC 集成了一个efuse 电编程熔丝作为OTP(One-Time programmable,一次性可编程)存储器。efuse 内部数据只能从0 变成1,不能从1 变成0,所以只能写入一次。
- CA:Certificate authority,证书颁发机构。
- 非对称加密算法:指加密和解密使用不同密钥的加密算法,也称为公私钥加密。可用于加密交换数据或者数字签名。常见的非对称加密算法:RSA、DSA(数字签名用)、ECC(移动设备用)、Diffie-Hellman、El Gamal。
- RSA:One public-key cryptosystems,由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的;
- Hash:它是一种单向算法,用户可以通过Hash算法对目标信息生成一段特定长度的唯一的Hash值,却不能通过这个Hash值重新获得目标信息。因此Hash算法常用在不可还原的密码存储、信息完整性校验等。
- SHA:Secure hash algorithm,可以对任意长度的数据运算生成一个160位的数值;
2、背景和需求
近年来,全球各地不断涌现出具有网络互联、汽车共享、自动驾驶等车联网概念的智能汽车,标志着车联网大发展时代已经到来。然而,车联网在实现汽车智能化的同时,由于网络的开放性,导致出现在互联网等领域的传统安全问题也开始对汽车带来威胁。在没有网络安全充分保障的情况下,智能网联汽车带来的可能就是灾难。近几年,国内外已经先后出现了不少针对智能网联汽车的破解与攻击事件。
车机作为车联网的重要枢纽,在提供信息娱乐、智能控制等便利功能的同时,也存在诸多信息安全隐患。当前不管是国产还是合资车企,对车机安全方面越来越重视。Secure boot作为保护固件免遭恶意纂改的方案,是整个系统安全的基础。
3、安全加密基础
3.1、加密和解密算法
加密就是使用相关算法将原始数据变换成另外一种形态。解密是一个加密反过程,使用相同算法将加密后的数据还原成原始数据。
如果光有算法的话,别人知道你使用的加密算法就能将你的数据还原,所以还需要秘钥的存在,我们只有同时知道秘钥和加密算法,才能对数据进行还原。加密秘钥和解密秘钥可以相同也不可能不同。如果相同,则使用的算法称为对称加密算法;如果不同,则使用的算法称为非对称加密算法,加密秘钥称为私钥,解密秘钥称为公钥,有些特殊的算法则可以私钥和公钥同时可以进行加密和解密。安全启动采用的是非对称加密算法,OEM用私钥对要保护的数据进行加密。
一种摘要算法,把一笔任意长度的数据通过计算得到固定长度的输出,但不能通过这个输出得到原始计算的数据。
3.2、数字签名
数字签名是通过一些密码算法对数据进行签名,以保护源数据的做法。也就是将输入数据和密钥通过加密算法得到一段数据,这段数据就是数字签名。
签名过程(signing):
Data表示要签名对象,首先计算Data的hash值,然后再用私钥加密得到签名(signature),最后把签名和Data打包到一起得到数字签名后的数据。
验证过程(verification):
签名后的数据由原始Data和signature组成,通过公钥解析数字签名得到Data的hash,对比Data的hash,即可确认Data是否完整。
签名者通过私钥对数据进行签名并发给接收者,接收者再用公钥解析,可保证数据是由签名者发出的,并且文件没有被修改过。
举个简单的例子:A想发送一段数据给B,这个时候A需要:
1、生成公钥和私钥对(一对一的关系),发布公钥,私钥保密
2、使用相关摘要算法针对原始数据计算摘要,得到摘要。
3、使用私钥通过加密算法对摘要进行签名,得到数字签名。
4、把原始数据和数字签名一起打包发送给B
这个时候,B接收A发送的数据后,需要:
1、知道A发布的公钥;
2、使用相同算法计算原始数据的摘要;
3、使用A的公钥对数字签名进行解密得到A原始的摘要;
4、对比自己算出的摘要和解密数字签名后的摘要,如果一致,则说明数据合法。
如果接收数据不完整,则双方计算出的摘要肯定不一致,而且因为公钥和私钥是钥匙对,也就是说全世界只有一对,私钥全世界又只有A知道,所以B可以通过签名和公钥可以确定数据来源于A,A也不能否认数据不是自己发的。
综上所述,典型的数字签名方案包括以下三个算法:
- 密钥生成算法,用来输出公钥和私钥,私钥用于签名,公钥用于验证。
- 签名算法,用私钥对给定数据进行加密来生成签名。
- 签名验证算法,用公钥对加密过的消息进行解密验证。
3.3、数字证书
数字证书是一个经证书授权中心数字签名的包含公钥拥有者信息以及公钥的文件,是一种权威性的电子文档。数字证书结构如下:
4、Secure boot实现原理
4.1、Secure boot签名过程
- 生成签名密钥对(公钥+私钥)
方法:此处省略,涉及机密,具体的请询问硬件平台供应商。
生成签名密钥对会生成许多文件,其中有一个叫做rotpk.bin的文件。rotpk.bin包含了根证书公钥的hash值,它将被烧录到efuse中,用于验证根证书的公钥。注意,只有在烧录了安全固件的样机中才能烧录rotpk.bin。otpk.bin中其他内容为用于给固件签名的私钥,一个车机的固件有很多个部分组成,每个部分都需要单独的私钥进行签名。
利用pack工具打包,一般平台供应商会提供。
签名后的固件包含了原始的固件文件和签名,其中签名中包含了公钥和加密的hash值,即:签名后的固件 = 原始固件+签名(加密的固件hash值)+证书(公钥)。每个固件的RSA公钥保存在前一级用私钥签名的image中。而第一级的公钥HASH保存在soc的efuse中,以防止公钥被修改。RSA私钥是Secure boot的保障,必须妥善保存。
4.2、Secure boot验证过程
Efuse保存了根证书公钥的hash,用来验证根证书是否合法。根证书中保存了其他固件的证书公钥的hash,用来验证这三个证书的公钥是否合法。公钥通过验证后,再解密固件签名得到固件的hash值,此hash值即可用来和固件实际的hash进行比较,如果相等则可证明该固件没有被纂改可以信任并被执行。
车机使能Secureboot之后,系统的启动流程如下:
工具烧录安全固件到emmc;
烧录rotpk.bin到efuse;
系统上电启动,利用efuse中保存的根证书公钥的hash值验证根证书合法性;
根证书保存了子固件的证书公钥hash,可以验证子固件的证书是否合法;
子固件的证书内包含有子固件对应的公钥,此公钥即可用来解密固件的签名,并跟真实的子固件签名进行比较,确认子固件是否被纂改;
如果通过验证,则可以正常开机。
注意事项:
①、rotpk只能烧录一次,烧录后不可再修改。
②、烧录过安全固件后,芯片每次上电都会对固件进行安全性检查,这时候烧录普通固件,会因为无法通过检查而不能启动。故安全固件和普通固件不可混合使用。
③、芯片未烧录rotpk时,根证书的合法性检查跳过,默认是合法的。这种情况下,样机可以刷用不同密钥签名过的固件。反之,只能刷对应rotpk.bin这个密钥签名过的固件。
④、即使没有烧录rotpk.bin,也不要随便下载安全版本,否则先刷会导致efuse里面的secureboot bit位置为1,此机子只能刷安全启动版本启动。