实现安全的USB传输
自定义HID应用示例。此应用使用USB的人机接口设备(Human Interface Device,HID)类发送自定义数据。除固件外,还提供用C++编写的与设备对话的示例程序。本示例将使用PIC18F46J50 USB演示板(部件编号MA180024)作为硬件平台。 加密前,使用任何USB协议分析仪均可查看通过总线发送的数据(见图2)。在图2中,主机正在发出获取按钮状态的请求,演示板将返回状态。第一个字节0x81指示此数据包是按钮状态,第二个字节0x01表示按钮未按下。 图2 分析仪中的数据以普通视图显示,任何人均可查看 创建此示例的固件时应执行以下步骤: 将加密源代码添加到USB应用示例项目中; 将发送或接收的数据填充为16字节的倍数,该值是此示例中使用的AES算法的块大小; 创建加密/解密密钥。此示例使用128位版本的AES,因此需要16字节密钥; 对通过总线向外传送的数据加密,而对接收自总线的数据解密。 图3 与图2相同的数据传输,但已经过加密 在图3中,字节1和2的含义并未改变,但已经过加密。因此,没有密钥便无法在总线上解密字节1和2。此外,还增加了一个计数器,使每个数据包之间稍有不同。(后文将介绍为什么可能有人希望增加此功能。) 在数据传输的PC端,第一步是包含所需加密库。这通过添加一个到内置加密模块的引用实现。使用固件中之前使用的密钥创建加密/解密密钥的实例。现在,通过总线发送的数据将是安全的。这并不意味着系统也安全,但离这个目标已越来越近。 重放攻击 尽管发送的数据值现已安全,但由于有重放攻击,系统仍然不安全。重放攻击是指某人在捕捉发送的通信后重放相同的数据。在此处给出的示例中,某人可捕捉请求按钮状态的事件序列以及按钮返回数据包,并使用其创建设备来做出简单的加密响应,指示按钮已按下。攻击者无法判断他们发送了哪些值,但能够使USB主机认为按钮已按下。 前文所述的加密算法功能有助于保护此应用。由于加密算法的设计机制,任何一位发生变化都会得到完全不同的块值,因此可向每个数据包中加入一个随机数。这会在通信过程中产生看似非常随机的行为。虽然这不能完全消除重放攻击,但它使应用更加难以攻击。有多种方法可实现随机数功能,但都有各自的缺点。 从主机交换到设备的单个随机数可在初始通信期间生成,该数字随后会包括在发送的数据中。虽然这有助于使各会话间的数据看起来随机化,但只要攻击者确定出通信会话所采用模式,就无法防止他们劫持总线中间通信。 每次通信都可发送一个惟一的随机数。虽然这使系统更难以破解(因为攻击者需要等待已知请求才能发送已知响应),但它要占用更大的数据存储空间。此方法只有在使用非对称加密时才真正可行。如果使用对称加密,则完整的请求和响应表迟早会被发现,最终破解也会变得轻而易举。 基于PC的攻击 对USB数据传输进行加密有助于防止系统被破解,但只要有一个人成功破解系统并将破解方法公之于众,任何人都能在将来进行破解。 数据到达PC后,在处理敏感数据时仍然需要考虑一些注意事项。PC上没有数据是安全的,即使其已经加密。更为老练的攻击者能够编写应用程序来扫描PC上的RAM,以寻找可能的密钥或解密数据。如果在PC上解密通过USB发送的数据,则在某一时刻,密钥与原始解密数据将驻留在RAM中,从而可被应用程序读取。这需要更长时间和更高级的专业技术才能破解,但仍然存在破解的可能性。在这种情况下,非对称加密可再次帮助保护数据,因为破解需要用户在每次连接设备后都检测新密钥。但这仍然无法完全保护系统。 解密后的数据仅存在于安全设备的应用最不可能被破解。此模型在某些应用中尤为适用。例如,加密的自举程序可加密安全服务器上的。hex文件,并且只在攻击者无法触及单片机时才在单片机上解密数据。再比如一个将捕捉的数据文件发送到PC的数据记录器,其并不在本地解密数据和显示结果,而是将加密数据通过Internet发送到安全服务器来解密数据,然后将不含敏感数据的结果摘要返回给用户。 总结 对于生成并传输惟一或随机机密数据的应用来说,可以用最少的成本轻而易举地进行加密。而静态程度高、传输行为可预测的应用则略难保护。在所有加密系统中,都不应假定数据是安全的,而应该通过加密阻止数据窃取。增加密钥长度、在数据载荷中加入随机性以及非对称密钥交换等技术均可提高对潜在数据窃取的抵御程度。其他一些方法同样有助于保护传输的数据,这些方法各自均有优缺点。在任何应用中设计加密都需要在抵御程度与实现该抵御所需的成本之间找到平衡。
- USB传输机制(12-15)
- USB传输类型(12-12)
- 改善USB传输速度不佳的简单方法(12-12)
- 西门子PLC通信或数据出现异常的时候如何重置(12-14)
- 串口通信-数据发送到PC加1后接收到单片机在数码管上显示(12-02)
- 串口通信数据校验问题(11-18)