3

我使用一些 PIC 微控制器和 nRF24L01 无线射频模块创建了一个小型无线网络。其中一个 PIC 是 PIC18F46K22,它用作向所有其他 PIC 发送命令的主控制器。所有其他(从)微控制器都是 PIC16F1454,到目前为止有 5 个。这些从控制器连接到各种设备(主要是灯)。主微控制器用于向这些设备传输命令,例如打开或关闭灯。这些设备还将连接设备的状态报告回主控制器,然后将其显示在 LCD 屏幕上。整个设置运行良好。

问题是任何拥有这些便宜的 nRF24L01 模块的人都可以简单地听取主控制器发送的命令,然后重复它们来控制设备。

加密命令不会有帮助,因为这些是简单的指令,如果加密它们看起来总是一样的,并且不需要解密它就能够重新传输消息。

那么我将如何在这个系统中实现一定程度的安全性呢?

4

1 回答 1

4

您要做的是防止重放攻击。对此的一般解决方案涉及两件事:

  1. 在所有消息中包含时间戳和/或正在运行的消息编号。拒绝太旧或无序到达的消息。

  2. 在每条消息中包含一个加密消息验证码。拒绝任何没有正确 MAC 的消息。

MAC 应至少为 64 位长,以防止暴力伪造尝试。是的,我知道,对于小消息来说,这是很多位,但请尽量抵制住吝啬它的诱惑。48 位可能是可以容忍的,但 32 位肯定会进入危险领域,至少除非您对传入消息实施某种速率限制。

如果您还要对消息进行加密,则可以通过使用经过身份验证的加密模式(例如SIV )将 MAC 与加密的初始化向量相结合来节省一些字节。SIV 无论如何都是加密小消息的不错选择,因为它被设计为非常“万无一失”。如果不需要加密,CMAC是一个不错的MAC算法选择,也是SIV内部使用的MAC。

大多数 MAC(包括 CMAC)都基于AES分组密码,因此您需要为您的微控制器找到此类密码的实现。在electronics.SE 上快速搜索有关微控制器的AES 实现的问题,以及标题为“PIC18F4550 上的快速AES 实现”的博客文章。还有专门为微控制器设计的小型分组密码,但此类密码的分析往往不如 AES 彻底,并且可能存在安全漏洞;如果可以的话使用AES,我会的。请注意,许多 MAC 算法(以及 SIV 模式)仅在一个方向上使用分组密码;分组密码的解密部分从不使用,因此不需要实施。

时间戳或消息编号应该足够长,以防止其缠绕。但是,有一个技巧可以用来避免在每条消息中传输整个数字:基本上,您只发送数字的最低一或两个字节,但您也在 MAC 计算中包含数字的较高字节(如相关数据,如果使用 SIV)。当您收到一条消息时,您会根据传输的值和当前时间/最后一次接受的消息编号重构较高的字节,然后验证 MAC 以检查您的重构是否正确并且消息是否过时。

如果您这样做,最好让设备定期发送包含完整时间戳/消息编号的同步消息。这允许它们从例如导致截断计数器回绕的长时间消息丢失中恢复。对于基于顺序消息编号的方案,典型的同步消息将包括设备迄今为止发送的最高消息编号以及它们将接受的最低编号作为回报。

为防止意外断电,应定期将消息编号写入永久存储器,例如闪存。由于您可能不希望在每条消息之后都执行此操作,因此一个常见的解决方案是只保存每条消息的数量,例如 1000 条消息,并为保存的值添加 1000 的安全边际(用于传出消息)。您还应该设计数据存储模式以避免直接覆盖旧数据,以最大限度地减少内存磨损并避免在写入期间断电时数据损坏。然而,这个细节有点超出了这个答案的范围。

附言。当然,MAC 计算还应始终包括发送者和预期接收者的身份,以便攻击者无法通过例如将消息回显给发送者来欺骗设备。

于 2013-08-15T20:17:01.477 回答