我只想让受信任的设备连接到我的外围设备。我不希望任何人能够发现我的外围设备的服务和特性。 因此,在连接到外围设备之前,我想显示带有密码的警报。有可能做到这一点,最简单的方法是什么?
我找不到这个问题的答案,并试图通过在权限中添加CBAttributePermissionsWriteEncryptionRequired来实现加密特性:
self.characteristic = [[CBMutableCharacteristic alloc] initWithType:[JUUIDBuilder uuidWith:@"1706"]
properties: CBCharacteristicPropertyWrite
value:nil permissions:CBAttributePermissionsWriteEncryptionRequired];
由于某些原因它没有帮助,因为我能够在没有任何安全检查的情况下始终从我的第二个设备写入值。 (CBAttributePermissionsReadEncryptionRequired的文档说:
...特性配置为仅允许受信任的设备读取或订阅其值。当连接的远程中心尝试读取或订阅此特性值时,Core Bluetooth会尝试将本地外围设备与中心配对以创建安全连接。
对我来说没有意义。什么是“可信设备”?
任何人都可以帮助我吗?允许仅通过引脚代码确认的可信设备进行连接的最佳做法是什么?
答案 0 :(得分:4)
您无法阻止发现的服务和特征。您可以宣传主要服务并拥有未公布的辅助服务,但一旦建立连接,将显示所有服务和特征。
如果指定属性需要加密,则在首次尝试读取/写入特征时将启动配对(技术绑定)过程。此过程交换加密密钥并导致设备相互信任。
如果您的外围设备和中央设备都是iOS8设备,那么我发现如果两个设备都配置了相同的iCloud帐户,那么信任已经建立(可能是为了切换等功能),您将永远不会看到配对对话框。当我试图测试加密特征时,这让我感到非常困惑。
如果您使用具有不同iCloud帐户的设备进行测试,那么您应该会看到配对对话框。
如果“攻击者”控制了两个设备,即使配对过程也不会“保护”您的服务/特性,因为他们可以简单地完成配对过程。配对/绑定确实可以防止数据被窃听,因为传输将被加密。
要实际保护服务,您需要在暴露数据之前需要某种形式的挑战/响应,包括特征。
例如,中心需要从外围设备随机设置的特征“A”中读取值。然后中央需要计算对该值的正确响应并将其写回“A”。只有当该值正确时,外围设备才会设置剩余特征的值(或接受来自中心的其他特征的输入)。
只要您的质询/响应机制没有受到损害,但这可能会打败未确定的攻击者,此解决方案才是安全的。