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

标签 ios core-bluetooth

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

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

self.characteristic = [[CBMutableCharacteristic alloc] initWithType:[JUUIDBuilder uuidWith:@"1706"]
                                                         properties: CBCharacteristicPropertyWrite
                                                              value:nil permissions:CBAttributePermissionsWriteEncryptionRequired];

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

...the characteristic is configured to allow only trusted devices to read or subscribe to its value. When a connected, remote central tries to read or subscribe to this characteristic’s value, Core Bluetooth tries to pair your local peripheral with the central to create a secure connection.

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

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

最佳答案

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

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

如果你的外围设备和中央设备都是 iOS8 设备,那么我发现如果两个设备都配置了相同的 iCloud 帐户,那么信任已经建立(大概是为了实现诸如切换之类的功能),你永远不会看到配对对话框。当我尝试测试加密特性时,这让我很困惑。

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

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

要真正保护服务,您需要在公开数据之前进行某种形式的涉及特征的质询/响应。

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

只有在您的质询/响应机制未受到损害时,此解决方案才是安全的,但可能会打败不确定的攻击者。

关于ios - 如何实现与 CBPeripheral 的安全连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30905157/

相关文章:

bluetooth-lowenergy - LE L2CAP 面向连接的 channel - 堆栈/操作系统支持

ios - 任何 iBeacon proximity UUID 的应用程序回调

iphone - 应用程序未通过代码设计验证

ios - 无法构建 Objective-C 模块 'CoreGraphics'

ios - 如何在 Swift 中获取 UIScrollView 垂直方向?

ios7 - 低功耗蓝牙 (IOS) - 后台广告和自定义广告数据

ios - CBPeripheralManager 延迟停止广告/位置管理器范围已停止 iBeacon

iphone: View 隐藏后重新启动循环动画,然后重新出现?

ios - XCode 4.5 - 架构 armv7 的 undefined symbol

iphone - 应用程序在后台崩溃,而蓝牙连接长时间丢失