MCU中的Secure启动
最近安全这个词在MCU中被提及的次数越来越多了,因为各种设备联网需求,人们对于信息安全的需求也越来越高,设备安全的要求也越来越高。另外设备厂商对于自己程序的安全性也越来越重视。
现在MCU中一般都会支持一个Secure boot的功能,这个功能简单来说就是支持MCU可以识别设备中的固件是不是一个可以信任的固件,如果是信任的估计,那么MCU就会启动这个固件,否则MCU会拒绝执行这个固件。
这个过程看起来是比较简单,但是实际上涵盖了多种加密技术和数字签名技术,技术原理比较复杂,但是好在操作流程相对简单一些。
Secure Boot固件升级的几个步骤:
- 产生常规的二进制可执行固件
- 对固件进行签名,签名时使用自己保密的私钥
- 对签名后的固件进行加密
- 利用加密之后的固件对设备进行升级
Secure boot启动的步骤:
- Secure boot一定是在芯片内部固有的一个boot loader开始启动的,这个boot loader一般在ROM中,不可更改。
- Bootloader首先进行一系列芯片硬件以及一些安全配置的初始化。
- BootLoader读取签名后的镜像,并对签名镜像进行校验
- 镜像签名校验通过之后,启动镜像,否则跳转到下载模式
镜像签名
从上面流程中我们可以看出Secure Boot的一个关键就是对镜像的签名,这个签名过程实际上应该是一个信息摘要和非对称加密的过程,下面就对签名过程和签名校验过程做一个简单的描述:
签名
签名的主要意义是证明这个固件是由签名者产生的,是一个可以信任的固件。那么签名过程就需要杜绝第三方对签名进行伪造,这个防止伪造的过程是通过私钥公钥的非对称算法来实现的。简单来说签名过程就是利用私钥进行加密,而校验过程是通过公钥进行解密。私钥由签名者妥善保存,所以私钥的安全性是签名安全的基础,一旦私钥泄露,签名也就没什么意义了。因为这里加解密实际上是一个非对称加解密,这种算法费时费力,所以一般都是对固件进行一个信息摘要提取,然后对比较小的摘要值进行签名。所以签名的基本流程如下:
- 对要签名的数据进行信息摘要提取
- 对提取的信息摘要进行私钥加密得到签名
- 将要签名的数据和签名合并作为签名结果
签名验证
签名验证的主要目的就是验证签名是否由信任的签名者(签名私钥的持有者)产生,签名验证的过程和签名过程基本类似:
- 对签名数据进行信息摘要提取(摘要提取算法和签名时用到的算法保持一致)
- 对签名结果进行解密(解密用到是预先存储的一个公钥),解密得到一个信息摘要值
- 将算法提取的摘要值和解密得到的摘要值进行比较
- 比较一致则签名正常,可以启动,否则拒绝启动。
镜像加密
镜像签名虽然保证了镜像不会被任意篡改,但是因为镜像本身并没有经过加密,依然是明文的形式存在,这种镜像也不能任意传播,毕竟代码在里面,无法保证代码的安全性,为了解决这个问题,我们还需要对镜像进行加密操作,这个操作一般就是对称加密。具体的流程如下:
- 首先我们要将对称加密的秘钥写入MCU(一般是不可更改的fuse),并且这个Key一般是不能读的
- 用秘钥对签名镜像进行加密,此处使用对称加密算法
- 程序升级时,BootLoader调用芯片内部的KEY对镜像进行解密,并将解密结果放到Flash中,也就是说Flash中实际存储的是签名之后的固件。
- 升级完成之后重新启动,MCU就会进入正常Secure Boot,对镜像进行签名校验操作,保证每次启动的时候镜像不被篡改。
以上就是Secure Boot中的一些基本操作和流程。
最后更新于 2019-10-06 22:19:13 并被添加「嵌入式 安全 加密」标签,已有 5776 位童鞋阅读过。
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。