前言:
作为物联网嵌入式设备厂家,经常会面临一个棘手的问题:由于物联网终端的硬件相对比较简单,芯片的管脚数量和管脚分布并不复杂,搞定一两颗主要的核心芯片就可以搞定整个PCB硬件,因此物联网嵌入式设备的硬件是比如容易被原封不动的pin to pin的仿制的,俗称“抄板”。因此,防止物联网设备被复制重任就落在了软件上了。
文本将探讨LoRa终端设备,如何通过技术手段,保护自己的知识产权不被轻松的复制,以保护自己产品的知识产权。如果不做任何保护,非抄板复制的可能性极大。
技术保护的手段是分层次的,而不是单一的手段,从底层的软件硬件结合到底层软件保护,再到应用层软件加密保护。
目录
3. 微处理器FLASH层-读:防止内部Flag的程序被Jtag全部读出
4. 微处理器FLASH层-读:防止内部Flag的数据被Jtag全部读出
1. 设备硬件设计层
如果采用市面上通用芯片,那么设备硬件设计层本身起不了大多的保护作用,但也不是没有任何保护手段,可以采用适当的保护措施,防止“抄板”。
(1)打磨掉芯片的标识
通过打开物联网终端设备的外壳,无法清晰的知道硬件芯片的型号。当然,这种方法也是有缺点的,毕竟很多场合下的硬件设计都有成熟的解决方案,即使没有芯片标识,也能根据管脚数和市面上已经的解决方案,猜出硬件芯片的信号。
(2)通过IO管脚或模拟电路信号管脚增加硬件电路专有性。
IO管脚的上来电平或下来电平,甚至是模拟管脚读取的电压幅度值,都可以作为软件判别是否需要继续执行的依据。
当然,这种方案需要底层软件配合,当底层软件从IO管脚或模拟信号管脚,读到的电平与预计的电平不一致,就终止程序的执行。
这种方法的缺点也是比较明显的,这种保护的作用有限,毕竟仿制者很容易原封不动的翻制原先的电路图和电路板。
2. 微处理芯片层:增加唯一标识保护
每个STM32芯片都有一个全球唯一的ID,是微处理器的唯一标识。ID号是12个字节大小,共96位,存放的寄存器的地址是:0x0x1FFFF7E8。
这个唯一码可以利用作硬件电路的身份标识,软件在启动是通过读取自身设备的ID号,与软件中预先定义的ID号进行比较,如果不一致,就disable业务功能。
示例步骤如下:
(1)读取目标板子的ID号,并修改程序将ID号保存在程序中:
u8 sys_id[12]={0}; //存储stm32芯片的ID号的数组
for(i=0;i<12;i++)
{
sys_id[i]=*(u8*)(0x1FFFF7E8+i); //从CPU特定地址的寄存器中读取STM32芯片的唯一ID。
}
(2)目标板上的程序在启动过程中可以读出该ID, 并与代码中认可的ID进行比较,如果不一致,则终止程序的执行。
优点是:即使程序被其他人通过jtag读取或通过其他途径获取,程序也无法在其他CPU板子上运行,因为与CPU设备ID不一致。这种方法主要防止的是程序通过非JTAG读取获取,而是通过其他途径,如工厂途径,原先的程序员等。
麻烦是:每块板子的程序的ID不一样造成程序生产、维护很麻烦,不同的硬件电路板(包括已经焊接的单片机)需要绑定不同的程序。
缺点是:如果已经获取了目标代码的hex/bin文件的情况下,直接修改目标代码程序,绕过对固定地址0x1FFFF7E8的读写,获取读取到全1的地址空间。
3. 微处理器FLASH层-读:防止内部Flag的程序被Jtag全部读出
嵌入式安全性最大的挑战是,Flash中的程序和数据,被原封不动的拷贝,为了防止嵌入式程序被无条件的拷贝。芯片厂家采取了一些特殊的手法:禁止读出Flash存储器内容;
所有STM32的芯片都提供对Flash的保护,防止对Flash的非法访问 - 写保护和读保护。
读保护即大家通常说的“加密”,是作用于整个Flash存储区域。一旦设置了Flash的读保护,内置的Flash存储区只能通过程序的正常执行才能读出,而不能通过(1)调试器(JTAG或SWD)或(2)从下载到RAM中的程序读取整个Flash内存空间中的内容。这种加密的目的是防止板子中的程序被其他人非法读出使用。
这种方法主要是防止程序被读出,正如文章开头所说,一旦设置了Flash的读保护,内置的Flash存储区只能通过程序的正常执行才能读出,而不能通过这两种方式中的任何一种方式读出:通过调试器(JTAG或SWD)和从RAM中启动并执行的程序。这是也无法对flash进行烧写程序了,所以使用时需要谨慎。
下面简单介绍下使用方法的实例(不是真实代码)
(1)在程序中包含#include "stm32f10x_flash.h"头文件
并在这条语句前面加入 这一行话:#define _FLASH_PROG; //flash读写保护时需要加入的
(2)实现flash的读保护的方法
/* 设置Flash读保护 */
if (FLASH_GetReadOutProtectionStatus()!=SET) //没有设置读保护
{
/* 会擦除Flash */
FLASH_Unlock(); //如果有了写保护,就不能再操作了。
FLASH_ReadOutProtection(ENABLE); //设置读保护
}
(3)清除flash的读保护方法
/* 清除Flash读保护 */
if (FLASH_GetReadOutProtectionStatus()==SET) //已经有了读保护。
{
/* 会擦除Flash */
FLASH_Unlock();
FLASH_ReadOutProtection(DISABLE);
flash_unlock_timeout=1500;
}
4. 微处理器FLASH层-读:防止内部Flag的数据被Jtag全部读出
这种方式,与(3)方法是一致的,不同的是(3)保护的是FLASH中代码的安全性,而这里保护的是FLASH中数据的安全性。
通常情况,LoRa终端设备的Device ID, LORAWAN_APPLICATION_KEY(应用层解码秘钥) 等LoRaWAN通信中的各种参数,都可以作为配置参数存储在微处理SOC芯片内部的FLASH中。
因此,防止FLASH中数据被读出,是阻止LoRa终端被“抄板”的一种手段,因为新“翻制”的硬件设备中,更换芯片后,也失去了LoWAN通信相关的配置数据参数。
没有这些配置数据,即使有二进制代码, 也无法正常通信!
5. 微处理器Flash层-写:防止向Flash中写入代码
Flash写保护打开后,不能再通过JTAG下载程序了,也无法通过程序写数据,必须通过执行FLASH中代码,先解锁FLASH,解锁的方法是通过程序中的Flash驱动程序来完成的。
FLASH_Unlock(); //如果有了写保护,就不能再操作了。
这种方法的作用:是防止目标硬件被改写软件。
而大多数遇到的情况下是正好相反,抄写者重新翻制硬件,而需要复制软件。
因此这种保护方法,应用场景不多。
6. 管理配置命令
LoRa终端设备的Device ID, LORAWAN_APPLICATION_KEY(应用层解码秘钥) 等LoRaWAN通信中的各种参数,通常作为作为配置参数存储在微处理SOC芯片内部的FLASH中。
这些参数的使用结合FLASH读保护,就可以有效的阻止FLASH中程序和数据被“拷贝”的风险与可能性。
没有这些配置数据,即使有二进制代码, 也无法正常通信!
这就需要为原设备厂家提供一种手段,用来在出厂前为设备提供配置数据的输入,包括device ID和应用层解码秘钥。
通常情况下,会提供通过串口通信的方式,提供这种修改配置参数的手段,因此串口通信的安全就显得尤为重要。有几种方法可以保证串口通信的安全:
(1)串口通信采用二进制模式:
这种模式开发专门的客户端程序,提供配置终端的用户界面。
(2)串口通信采用文本格式
这种模式可以不需要专门的客户端程序,简单的串口终端就可以了,但这种模式及其不安全。
(3)串口通信采用文本格式 + 密码
这种方式克服了文本传输不安全的隐患,同时拥有文本传输的方便性。
但这种方式也是有缺点的,因为密码是写死在代码中的,一旦密码随二进制代码一起泄露,就起不了安全保护的作用了。
7. LoRaWAN层
(1)LORAWAN_DEVICE_EUI
设备ID是区分LoRa终端的唯一的身份标志,但同时成为防止终端被复制抄板的一种手段。
如果原封不动的抄板整个终端(包括硬件+软件),导致所有终端使用相同的ID身份标识。很显然,被仿制的终端是无法正常工作的。
当然,通过这种身份标识号来阻止终端抄袭后正常使用的保护手段,也有一个缺点:
就是终端需要手工输入不同的Device ID, 以一方面需要开发相关的命令行接口软件,用于设置Device ID, 另以方便,降低了生产环节的效率。
为了应对这个缺点:有些安全要求不要的应用场合,会采用微处理器的唯一标识作为基数,采用固定的算法,计算得到设备的Device ID号。这样就出厂前写入LORAWAN_DEVICE_EUI号了。
但这样的方法,算是LORAWAN_DEVICE_EUI带来的知识产权保护的附加功能。
(2)LORAWAN_NWKSKEY:LoRaWAN层通信安全的加密保护
为了阻止LoRaWAN终端与服务器之间的通信数据被窃听,LoRoWAN终端与服务器之间的通信数据是加密的,秘钥是在通信过程中传递给终端。
8. 应用程序层
(1)应用程协议的安全
LoRa终端与应用层协议,不是LoWAN的标准协议。不同厂家的设备,应用程序层的协议规范是自定义了,设备厂家掌控,与LoWAN协议无关。
对于终端和服务器是同一个利益共同的的厂家。为了防止终端被“抄板”,应用层协议的格式定义,通常是厂家私有的,不能公开。对于某些特定行业的应用,这种模式应用比较广泛。
但对于互联网应用中,上述模式逐渐被淘汰,在互联网模式中,服务器厂家与终端厂家是分离的,服务器厂家期望接入更多终端厂家的设备,这种情况下,服务器厂家会公开他们的应用层接口协议规范。以便于更多的设备厂家的设备接入其系统中,增加其用户的数量,服务器厂家并不关心,终端是否被仿制。
(2)应用层会话数据的安全
LORAWAN_APPLICATION_EUI:应用层ID(出厂前烧录或代码开发时预定义好)
LORAWAN_APPLICATION_KEY:应用层解码秘钥(出厂前烧录)
LORAWAN_APPSKEY: 应用层会话秘钥(在应用层会话建立时由服务器动态下发)
加密机制,有效的降低了应用程序协议的数据格式在网络传输中被窃听和被解密可能性 。
同时也降低了应用程序的通信协议在传输过程中被解码的可能性。
9.其他方法
当然,不同厂家,肯定还有其他的技术手段,本文仅作为一种参考框架:设备厂家如何保护自己产品的知识产权,如何防止自己的知识产权的保护手段遭到破解。
当然,这里没有谈到安全操作系统,主要是由于LoRa的终端,通常采用的是单片机,不支持安全操作系统。关于安全操作系统,在后续相关硬件设备中再探讨。
保护和破解本是相生相随。。。。。
我们在探讨保护技术和方法的同时,也暴露了如何破解的方法和手段。