1、前言
本博文不是讲解可信加签和固件加密的具体原理,而是谈谈实际嵌入式开发中,可信加签和固件加密的应用场景,可以帮助从事嵌入式开发的人员快速理解加签和加密的作用。
2、嵌入式开发中可信加签和固件加密介绍
(1)各家公司都有自己的可信加签和固件加密的方法,加密算法也不相同,有的是自己公司研发的,有的从专门做安全防护业务公司那里买的加密算法;
(2)可信验签和固件加密的原理不同,有的是靠软件,有的是靠硬件(芯片自带安全模块 或者 外接一块加解密芯片);
(3)除了维护可信加签和固件加密功能的开发人员,其他绝大部分开发人员是不需要了解可信加签和固件加密的底层原理,公司也不会随意开放这些代码权限给一般员工;
总结:绝大部分研发人员,只需要理解可信加签和固件加密的作用,能调用相关接口进行加签验签和加解密,不需要也没必要了解底层原理,花时间也不一定能搞清楚那些原理;
3、可信加签
3.1、可信加签的功能作用
(1)可信加签的作用体现在“可信”二字,也就是程序或者驱动是不是“可以信赖、安全可靠”的;
(2)可信加签有点类似于Windows的“数字签名”功能,你想要在Windows上安装驱动就必须先要去Windows官方进行认证,Windows官方认为驱动是安全的,才会让你安装这个驱动;
(3)在嵌入式产品中,出厂后一般程序就是固定的,出于安全和保密的考虑,是不希望让没有经过认可的程序和驱动在设备里运行,换句话说,希望设备里只能运行厂家自己的程序;
总结:可信验签能保证设备里运行的都是厂家自己的程序,能有效避免别有用心的人在设备上运行一些病毒程序;
3.2、实际场景分析
(1)在支持可信加签的设备里,想要在设备上运行程序或者驱动,必须对程序或者驱动进行加签,否则是不能在设备上正常运行的;
(2)如果你所在的公司开发的产品是支持可信验签功能,你可以尝试一下,直接将用交叉编译工具编译的程序拷贝到设备里,是不能正常运行的,会报“没有权限、验签失败之类”的错误;
(3)可信验签也用于设备升级,如果是没有进过加签的升级包是无法升级到设备里的;
3.3、实现原理浅析
(1)可信验签的实现原理主要包含两大部分:可信验签算法、程序运行或者驱动加载原理;
(2)可信验签算法:这个本人不熟悉,没有去仔细了解过,也不建议工作不相关的人去了解;
(3)程序运行或者驱动加载原理:这个需要了解内核如何运行elf格式的程序和加载ko驱动文件,这里简单说一下内核中的相关代码位置,内核运行elf格式程序是在fs/exec.c,加载驱动是在kernel/module.c,在运行elf格式程序、ko驱动文件时,先验签,验签通过才进行后续操作;
(3)这里可以简单介绍一下我了解过的一种可信加签的方法:加签就是加签算法根据文件内容在文件尾部追加固定字节的加签数据,内核在验签时就是去文件尾部读取固定字节的内容进行验签;
4、固件加密
4.1、固件加密的功能作用
(1)固件加密就是把文件从明文变成密文,如果你不知道解密的方法就是无法知道文件的内容;
(2)在嵌入式开发中,可以对各个分区内容进行固件加密,从分区中读取出来的内容要先进行解密才能正常解析出内容,这要求内核要支持解密操作;
4.2、实际场景分析
(1)对升级覆盖的分区内容进行加密,内核读取这些分区内容时先解密;
(2)每个分区都对应一个升级镜像文件,一般为.bin或者.img格式,在生成升级镜像时要进行固件加密;
5、可信验签和固件加密的比较
(1)可信加签:防止不是厂家的程序升级到设备中,或者在设备里运行;
(2)固件加密:防止厂家的升级镜像被未授权的人读取。分区内容一般都是以某种文件系统格式存在,如果没有固件加密,那别人拿到你的升级镜像,只需要烧录到他的设备里,然后按照相应的文件系统格式去挂载,这样就能解读出升级镜像里的内容;
总结:可信验签可以防止别人入侵,不是厂家的程序一概不让再设备上运行;固件加密可以防止别人解读厂家的程序和文件;
6、拓展
(1)可信加签和固件加密功能引入,会带来问题:谁来负责验签、解密?谁来负责对负责验签、解密的程序进行验签和解密?
(2)解决办法:用两级文件系统,内核先加载一级文件系统,一级文件系统主要负责加载验签和解密的驱动,内核加载一级文件系统是不进行验签和解密的;等加载好验签和解密的驱动后,去挂载二级文件系统,对二级文件系统就需要验签和解密;
推荐
给大家推荐一个学校嵌入式知识的网站,博主在大学时候学习嵌入式知识、找工作的时候都在用这个网站,网站里有C语言、Linux等等的笔试题、面试常问问题等等知识,无论是学习基础知识、面试刷题、交流工作经验都是不错的选择。大家一起进步,欢迎留言交流。
链接:学习神器跳转