安全启动实现了信任根。为了整体安全的需要,需要将信任传递到下一级。这个信任传递是通过加解密技术完成的。
在启动时,我们要至少保证下一级固件的完整可靠性。意味着,我们要使用认证技术,对用户固件进行验证。对用户固件进行验证可以使用哈希函数,也可以使用基于对称密钥的验证码 AES-GCM。
系统在安全启动前,需要保存已经烧录到 Flash 里的用户固件的哈希值。这个哈希值,通过前面所提到的 STM32 安全技术,保证它不会被内外攻击所改变。
系统在安全启动时,利用前面所构造的安全执行环境,对需要进一步执行的用户固件,进行一个哈希运算。哈希运算一般是采用 SHA256。
系统比较这两个值。如果计算出来的哈希值,与存储的哈希值相同,我们认为没有人对用户固件进行了改动。安全启动这时可以执行一个敏感信息的清理工作。如果有可能,可以将安全启动部分设置成不可访问,然后就放心大胆地跳转到用户固件去执行。
如果哈希值验证不通过,则系统直接重启。
对于 AES-GCM 来计算固件的验证码,也与算 SHA256 相同,都是对固件重新计算出一个值,然后与保存的值进行比较。
可重用的安全引擎
前面提到 STM32 SBSFU 将一些安全高度敏感的操作,包装在安全引擎里。这些安全高度敏感操作包括从安全引擎的初始化,从 Flash 中读取密钥、读写固件、进行加解密运算,像AES、ECDSA,还有从 Flash 中读些安全相关关的参数。
安全引擎是安全启动的核心可信代码,需要多项 STM32 平台的安全保护技术来综合保护,例如 Firewall 或者 MPU。安全引擎对外提供单一入口。在调用返回前,清理敏感信息。安全引擎也可以被用户固件调用。对用户固件来说,安全引擎是安全服务提供方。
安全启动在智能锁中的应用
对于某个特定的应用,只要资源不是受限制,那么安全启动的功能总是应该相似的。对于智能锁,我们可以直接应用 STM32 SBSFU。在编译 STM32 SBSFU 工程文件前,需要准备 python 环境。Python 环境是为了对密钥进行转化以及为固件更新所需要的对固件进行封装。
STM32 用户拿到 STM32 SBSFU 开发包时,一般会包含三个工程。
① 中间件 SE 安全引擎 Project:该工程是安全启动的核心可信代码,包括受信任的代码和密钥。密钥可以是对称密钥或者椭圆曲线 ECC 公钥。防火墙的调用门机制就是在该工程中实现。该工程输出的固件,会集成到安全启动与安全固件更新工程中去。
② 安全启动与安全固件更新 Project:该工程配置安全防护措施,集成安全引擎。该工程同时对外输出安全引擎的符号文件,供用户固件使用。
③ 用户固件工程Project:这是一个固件示例。
用户仅需要依次对这三个工程编译就可以了。在安全启动与安全固件手册更新有详细的一步一步操作说明。
前面提到 STM32 安全启动对外提供了受安全保护的安全引擎。用户程序的加解密操作,若需要比较高安全的服务,可以考虑使用安全引擎所提供的加解密服务。即使安全引擎中的服务不能满足需要,也可以考虑扩展安全引擎的功能。这个扩展不影响安全引擎的安全防护能力。
相关文章