MCU中的Secure启动

最近安全这个词在MCU中被提及的次数越来越多了,因为各种设备联网需求,人们对于信息安全的需求也越来越高,设备安全的要求也越来越高。另外设备厂商对于自己程序的安全性也越来越重视。

现在MCU中一般都会支持一个Secure boot的功能,这个功能简单来说就是支持MCU可以识别设备中的固件是不是一个可以信任的固件,如果是信任的估计,那么MCU就会启动这个固件,否则MCU会拒绝执行这个固件。

这个过程看起来是比较简单,但是实际上涵盖了多种加密技术和数字签名技术,技术原理比较复杂,但是好在操作流程相对简单一些。

Secure Boot固件升级的几个步骤:

  1. 产生常规的二进制可执行固件
  2. 对固件进行签名,签名时使用自己保密的私钥
  3. 对签名后的固件进行加密
  4. 利用加密之后的固件对设备进行升级

Secure boot启动的步骤:

  1. Secure boot一定是在芯片内部固有的一个boot loader开始启动的,这个boot loader一般在ROM中,不可更改。
  2. Bootloader首先进行一系列芯片硬件以及一些安全配置的初始化。
  3. BootLoader读取签名后的镜像,并对签名镜像进行校验
  4. 镜像签名校验通过之后,启动镜像,否则跳转到下载模式

镜像签名

从上面流程中我们可以看出Secure Boot的一个关键就是对镜像的签名,这个签名过程实际上应该是一个信息摘要和非对称加密的过程,下面就对签名过程和签名校验过程做一个简单的描述:

签名

签名的主要意义是证明这个固件是由签名者产生的,是一个可以信任的固件。那么签名过程就需要杜绝第三方对签名进行伪造,这个防止伪造的过程是通过私钥公钥的非对称算法来实现的。简单来说签名过程就是利用私钥进行加密,而校验过程是通过公钥进行解密。私钥由签名者妥善保存,所以私钥的安全性是签名安全的基础,一旦私钥泄露,签名也就没什么意义了。因为这里加解密实际上是一个非对称加解密,这种算法费时费力,所以一般都是对固件进行一个信息摘要提取,然后对比较小的摘要值进行签名。所以签名的基本流程如下:

  1. 对要签名的数据进行信息摘要提取
  2. 对提取的信息摘要进行私钥加密得到签名
  3. 将要签名的数据和签名合并作为签名结果

签名验证

签名验证的主要目的就是验证签名是否由信任的签名者(签名私钥的持有者)产生,签名验证的过程和签名过程基本类似:

  1. 对签名数据进行信息摘要提取(摘要提取算法和签名时用到的算法保持一致)
  2. 对签名结果进行解密(解密用到是预先存储的一个公钥),解密得到一个信息摘要值
  3. 将算法提取的摘要值和解密得到的摘要值进行比较
  4. 比较一致则签名正常,可以启动,否则拒绝启动。

镜像加密

镜像签名虽然保证了镜像不会被任意篡改,但是因为镜像本身并没有经过加密,依然是明文的形式存在,这种镜像也不能任意传播,毕竟代码在里面,无法保证代码的安全性,为了解决这个问题,我们还需要对镜像进行加密操作,这个操作一般就是对称加密。具体的流程如下:

  1. 首先我们要将对称加密的秘钥写入MCU(一般是不可更改的fuse),并且这个Key一般是不能读的
  2. 用秘钥对签名镜像进行加密,此处使用对称加密算法
  3. 程序升级时,BootLoader调用芯片内部的KEY对镜像进行解密,并将解密结果放到Flash中,也就是说Flash中实际存储的是签名之后的固件。
  4. 升级完成之后重新启动,MCU就会进入正常Secure Boot,对镜像进行签名校验操作,保证每次启动的时候镜像不被篡改。

以上就是Secure Boot中的一些基本操作和流程。

相关文章

发表新评论