use*_*599 4 security wireless pic
我使用一些 PIC 微控制器和 nRF24L01 无线 RF 模块创建了一个小型无线网络。其中一张 PIC 是 PIC18F46K22,它用作向所有其他 PIC 发送命令的主控制器。所有其他(从)微控制器都是PIC16F1454,到目前为止共有5个。这些从控制器连接到各种设备(主要是灯)。主微控制器用于向这些设备传输命令,例如打开或关闭灯。这些设备还将所连接设备的状态报告回主控制器,然后将其显示在 LCD 屏幕上。整个设置工作得非常好。
\n\n问题是,任何拥有这些廉价 nRF24L01 模块的人都可以简单地监听主控制器发送的命令,然后重复这些命令来控制设备。
\n\n加密命令\xe2\x80\x99不会有帮助,因为这些是简单的指令,如果加密,它们将始终看起来相同,并且不需要解密它就能够重新传输消息。
\n\n那么我该如何在这个系统中实现一定程度的安全性呢?
\n您要做的就是防止重放攻击。解决此问题的一般方法涉及两件事:
在所有消息中包含时间戳和/或正在运行的消息编号。拒绝太旧或无序到达的消息。
在每条消息中包含加密消息验证代码。拒绝任何没有正确 MAC 的消息。
MAC 的长度应至少为 64 位,以防止暴力伪造尝试。是的,我知道,对于小消息来说,这需要很多位,但请尽量抵制住吝啬的诱惑。48 位可能是可以容忍的,但 32 位肯定会进入危险领域,至少除非您对传入消息实施某种速率限制。
如果您还对消息进行加密,则可以通过使用经过身份验证的加密模式(例如将 MAC 与加密初始化向量相结合的SIV)来节省一些字节。无论如何,SIV 对于加密小消息来说是一个相当不错的选择,因为它的设计非常“万无一失”。如果不需要加密,CMAC是一个不错的MAC算法选择,也是SIV内部使用的MAC。
大多数 MAC(包括 CMAC)都基于分组密码(例如AES),因此您需要为您的微控制器找到此类密码的实现。Google 快速搜索后,在 electronics.SE 上找到了有关微控制器 AES 实现的问题,以及标题为“PIC18F4550 上的快速 AES 实现”的博客文章。还有专门为微控制器设计的小块密码,但此类密码的分析往往不如 AES 彻底,并且可能存在安全漏洞;如果你可以使用 AES,我会的。请注意,许多 MAC 算法(以及 SIV 模式)仅在一个方向上使用分组密码;分组密码的解密部分从未被使用过,因此不需要实现。
时间戳或消息编号应该足够长,以防止出现回绕。然而,有一个技巧可以用来避免在每条消息中传输整个数字:基本上,您只发送数字的最低一或两个字节,但也在 MAC 计算中包括数字的较高字节(如关联数据(如果使用 SIV)。当您收到消息时,您可以根据传输的值和当前时间/最后接受的消息编号重建较高字节,然后验证 MAC 以检查您的重建是否正确以及消息是否过时。
如果您这样做,最好让设备定期发送包含完整时间戳/消息编号的同步消息。这使它们能够从例如长时间的消息丢失中恢复,从而导致截断的计数器回绕。对于基于顺序消息编号的方案,典型的同步消息将包括设备迄今为止发送的最高消息编号以及它们将接受的最低消息编号。
为了防止意外断电,消息编号应定期写入永久存储器,例如闪存。由于您可能不想在每条消息后都执行此操作,因此常见的解决方案是仅每(例如 1000 条)消息保存该数字,并向保存的值(对于传出消息)添加 1000 的安全裕度。您还应该设计数据存储模式,以避免直接覆盖旧数据,既可以最大限度地减少内存磨损,又可以避免写入期间断电时数据损坏。然而,这个细节有点超出了这个答案的范围。
诗。当然,MAC 计算还应始终包括发送者和预期接收者的身份,以便攻击者无法通过将消息回显给发送者等方式来欺骗设备。