我使用一些PIC微控制器和nRF24L01无线RF模块创建了一个小型无线网络。其中一个PIC是PIC18F46K22,它用作主控制器,向所有其他PIC发送命令。所有其他(从)微控制器都是PIC16F1454,到目前为止已有5个。这些从属控制器连接到各种设备(主要是灯)。主微控制器用于向这些设备发送命令,例如打开或关闭灯。这些设备还会将连接设备的状态报告回主控制器,然后将其显示在LCD屏幕上。整个设置工作得很好。
问题是任何拥有这些廉价nRF24L01模块的人都可以直接听取主控制器发送的命令,然后重复它们来控制设备。
加密命令没有用,因为这些是简单的指令,如果加密,它们看起来总是一样,并且不需要解密它就能重新传输消息。
那么我如何在这个系统中实现一定程度的安全性呢?
答案 0 :(得分:4)
您要做的是阻止replay attacks。对此的一般解决方案涉及两件事:
在所有邮件中包含时间戳和/或正在运行的邮件编号。拒绝过时或无法到达的邮件。
在每封邮件中加入加密message authentication code。拒绝任何没有正确MAC的消息。
MAC应至少为64位长,以防止暴力伪造。是的,我知道,这对于小消息来说有很多不足之处,但是要尽量抵制吝啬它的诱惑。 48位可能是可以容忍的,但32位肯定会进入危险区域,至少除非你对传入的消息实施某种速率限制。
如果您还要对邮件进行加密,则可以使用authenticated encryption模式保存几个字节,例如SIV将MAC与initialization vector结合使用加密。无论如何,SIV是加密小消息的一个非常好的选择,因为它的设计非常“万无一失”。如果您不需要加密,CMAC是MAC算法的不错选择,也是SIV内部使用的MAC。
大多数MAC(包括CMAC)都基于block ciphers,例如AES,因此您需要为您的微控制器找到这种密码的实现。一个快速谷歌搜索出现了this question on electronics.SE about AES implementations for microcontrollers,以及this blog post titled "Fast AES Implementation on PIC18F4550"。还有专为微控制器设计的小型分组密码,但这种密码往往不如AES那么彻底,并且可能存在安全漏洞;如果您可以使用AES,我会的。注意,许多MAC算法(以及SIV模式)仅在一个方向上使用分组密码;从不使用分组密码的解密一半,因此无需实现。
时间戳或消息编号应足够长,以防止其缠绕。但是,有一个技巧可以用来避免每个消息传输整个数字:基本上,你只发送数字的最低一个或两个字节,但你还包括MAC中数字的更高字节计算(作为关联数据,如果使用SIV)。当您收到消息时,您将根据传输的值和当前时间/最后接受的消息编号重新构建更高的字节,然后验证MAC以检查您的重建是否正确并且消息不是陈旧的。
如果这样做,最好让设备定期发送包含完整时间戳/消息号的同步消息。这允许他们恢复,例如从长时间的消息丢失导致截断的计数器环绕。对于基于顺序消息编号的方案,典型的同步消息将包括设备迄今为止发送的最高消息编号以及他们将接受的最低编号。
为防止意外断电,应定期将消息编号写入永久存储,例如flash memory。由于您可能不希望在每条消息之后执行此操作,因此常见的解决方案是仅保存每条消息(例如1000条消息),并为保存的值(对于传出消息)添加1000的安全边际。您还应该设计数据存储模式以避免直接覆盖旧数据,以最大限度地减少内存磨损,并避免在写入期间断电时数据损坏。但是,这个细节有点超出了这个答案的范围。
聚苯乙烯。当然,MAC计算还应始终包括发送者和预期接收者的身份,以便攻击者不能通过例如技术来欺骗设备。将消息回传给发件人。