如何实现与CBPeripheral的安全连接?

sas*_*nec 1 ios core-bluetooth

我只希望受信任的设备连接到我的外围设备。我不希望任何人能够发现我的外围设备的服务和特征。\n因此,在连接到外围设备之前,我想显示带有 PIN 码的警报。有可能做到吗?最简单的方法是什么?

\n\n

我找不到这个问题的答案,并尝试通过将 CBAttributePermissionsWriteEncryptionRequired 添加到权限来实现加密特征:

\n\n
self.characteristic = [[CBMutableCharacteristic alloc] initWithType:[JUUIDBuilder uuidWith:@"1706"]\n                                                         properties: CBCharacteristicPropertyWrite\n                                                              value:nil permissions:CBAttributePermissionsWriteEncryptionRequired];\n
Run Code Online (Sandbox Code Playgroud)\n\n

由于某种原因,它没有帮助,因为我可以一直从我的第二个设备写入值,而无需任何安全检查。(CBAttributePermissionsReadEncryptionRequired 的文档说:

\n\n
\n

...该特征配置为仅允许受信任的设备读取或订阅其值。当连接的远程中央设备尝试读取或订阅此特性\xe2\x80\x99s 值时,核心蓝牙会尝试将本地外设与中央设备配对以创建安全连接。

\n
\n\n

这对我来说没有意义。这里的“可信设备”是什么?

\n\n

谁能帮我?仅允许来自具有 PIN 码确认的受信任设备的连接的最佳实践是什么?

\n

Pau*_*w11 5

您无法阻止服务和特征被发现。您可以公布主要服务并拥有未公布的次要服务,但一旦建立连接,所有服务和特征都将显示。

如果您指定某个属性需要加密,则当您第一次尝试读/写该特征时,将启动配对(技术上绑定)过程。此过程交换加密密钥并导致设备相互“信任”。

如果您的外围设备和中央设备都是 iOS8 设备,那么我发现如果两个设备都配置了相同的 iCloud 帐户,则已经建立了信任(大概是用于切换等功能),并且您将永远不会看到配对对话框。当我尝试测试加密特征时,这给我带来了相当大的困惑。

如果您使用具有不同 iCloud 帐户的设备进行测试,那么您应该会看到配对对话框。

如果“攻击者”控制了两个设备,那么即使配对过程也不会“保护”您的服务/特性,因为他们可以简单地完成配对过程。配对/绑定确实可以保护数据免遭窃听,因为传输将被加密。

为了真正保护服务,在暴露数据之前,您需要某种形式的涉及特征的质询/响应。

例如,中央设备需要从外围设备随机设置的特征“A”中读取一个值。然后,中央需要计算对该值的正确响应并将其写回“A”。仅当该值正确时,外围设备才会设置其余特征的值(或接受来自中央设备的其他特征的输入)。

仅当您的挑战/响应机制不受到损害时,此解决方案才是安全的,但可能会击败不确定的攻击者。