前言:
作为物联 嵌入式设备厂家,经常会面临一个棘手的问题:由于物联 终端的硬件相对比较简单,芯片的管脚数量和管脚分布并不复杂,搞定一两颗主要的核心芯片就可以搞定整个PCB硬件,因此物联 嵌入式设备的硬件是比如容易被原封不动的pin to pin的仿制的,俗称“抄板”。因此,防止物联 设备被复制重任就落在了软件上了。
文本将探讨LoRa终端设备,如何通过技术手段,保护自己的知识产权不被轻松的复制,以保护自己产品的知识产权。如果不做任何保护,非抄板复制的可能性极大。
技术保护的手段是分层次的,而不是单一的手段,从底层的软件硬件结合到底层软件保护,再到应用层软件加密保护。
目录
1. 设备硬件设计层
2. 微处理芯片层:增加唯一标识保护
3. 微处理器FLASH层-读:防止内部Flag的程序被Jtag全部读出
4. 微处理器FLASH层-读:防止内部Flag的数据被Jtag全部读出
5. 微处理器Flash层-写:防止向Flash中写入代码
6. 管理配置命令
7. LoRaWAN层
8. 应用程序层
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 {
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的终端,通常采用的是单片机,不支持安全操作系统。关于安全操作系统,在后续相关硬件设备中再探讨。
保护和破解本是相生相随。。。。。
我们在探讨保护技术和方法的同时,也暴露了如何破解的方法和手段。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!