PUF——让密钥更安全
刘豪
由于物联网(IoT)概念的大热,IoT设备的安全愈发受到大家的重视。大家对安全的要求日益增长,LPC55Sxx系列也应运而生。
对于安全应用,密钥管理机制至关重要。在传统的通用MCU中,最普遍的做法是将密钥的明文存储在片内的OTP或者Flash中,但是实际上,攻击者只需要通过比较低的代价就能从片内OTP或者Flash中获取到密钥。
安全的攻与防就是矛与盾的关系,当我们的竞争对手或地下产业只需花费极少的代价就可以攻破、山寨我们的产品时,我们也必须要升级我们的防御措施。而PUF可以在密钥存储上为我们提供更强的安全保护。
LPC55Sxx/54Sxx、i.MX RT600内置的PUF(Physical Unclonable Functions)是SRAM PUF。由于SRAM的硅结构特征,每一个SRAM的数字特征都是独一无二的。SRAM PUF的不可克隆特性(Unclonable),就是来源于SRAM独一无二的数字特征。
即使是NXP,也不可能制造出两颗数字特征一模一样的SRAM PUF。所以,我们称芯片内SRAM的独一无二的数字特征为芯片的指纹。利用芯片的指纹,就可以生成根密钥和储存所需的密钥。
本文无意引入更多的技术原理和细节,详情请参考芯片的用户手册(UM)和应用笔记LPC55Sxx usage of the PUF and Hash Crypt to AES coding( AN12324)。
下面将举一个简单的例子,更形象地为大家介绍PUF。
对于LPC55Sxx/54Sxx、i.MX RT600来说,每一颗芯片的PUF就像是一个独一无二的“安全管理公司”,在安全管理公司的工作时间内,我们通过注册(Enroll)后,安全管理公司将会为我们分配一个“安全管理员”,以及安全管理员对应的代号Activation Code(AC)。然后我们可以将我们的密钥或敏感信息交给我们的安全管理员保管(这个过程叫做Set Key),这个专业的安全管理员会将我们委托保管的信息随身携带、形影不离,并给我们一个与被保管信息相对应的Key Code(KC)。当我们需要使用密钥时,通过AC就可以找到相应的管理员(这个过程叫做Start)。在我们找到这个管理员后,就可以通过KC,来取回我们之前保管的信息(这个过程叫做Get Key)。当安全公司下班以后,安全管理员也会离开公司,此时公司空无一人,也没有任何信息残留。
小编刚写到这里,背后突然有位大咖冒出一句话:既然PUF的安全不依赖于AC和KC,就是说即使管理员被劫持不得已交出了AC和KC,密钥的安全也有保障。
在这个例子中,公司下班,就是指芯片断电。当芯片断电以后,芯片内的PUF并不保留任何信息,传统的Crack Fuse/Flash手段也就无效了,自然也就避免了传统的片内OTP Fuse和Flash在断电后被暴力读取的风险。
我们通过安全启动(Secure boot)等手段,使安全管理公司无法被非法访问,那么即使攻击者获取到AC和KC,由于没办法访问安全管理公司,也就无法获取到对应的原始敏感信息;由于每个安全管理公司是独一无二的,所以一个公司的AC和KC自然也是无法到另一个公司使用的,也无法通过其他芯片或芯片复制获得到对应的原始敏感信息。
这就解决了上文所说的传统密钥存储所面临的问题。
尽管PUF提供了更安全的密钥存储机制,但是并不会因为安全强度的增加而增加了使用难度。MCUXpresso SDK中还提供了易用的API,只需要三五个简单的API调用,就可以安全地存储密钥。
PUF不仅仅可以提供安全的密钥存储。对于LPC55Sxx系列来说,PUF还有直接连接到PRINCE和AES加密引擎的专用硬件通道(Hardware bus),由于这条硬件通道软件不可访问,在保证密钥存储安全的同时,也能保证密钥的访问安全。
这也就意味着,当我们在生产阶段利用PUF完成密钥配置(key provisioning) ,将AC和KC存储到Flash/OTP/EEPROM内,产品出厂后,CPU在不知道密钥的情况下,通过PUF以及AC和KC,就可以将Key通过专用硬件总线配送给AES和PRINCE,后者就可以利用这个密钥对相应的信息进行加解密等工作。
在此场景下,不仅利用PUF实现了密钥的存储安全,也实现了密钥的访问安全。
PUF也提供了一些其他更丰富的功能,满足各种需求的密钥管理,更多信息请关注用户手册有关章节以及相应的应用笔记。