我只想要可信的设备连接到我的外围设备。我不希望任何人能够发现我的外围设备的服务和特性。因此,在连接到外围设备之前,我想用一个引脚代码显示一个警报。有可能这样做吗?最简单的方法是什么?
我找不到这个问题的答案,试图通过在权限中添加CBAttributePermissionsWriteEncryptionRequired来实现加密特性:
self.characteristic = [[CBMutableCharacteristic alloc] initWithType:[JUUIDBuilder uuidWith:@"1706"]
properties: CBCharacteristicPropertyWrite
value:nil permissions:CBAttributePermissionsWriteEncryptionRequired];由于某些原因,这没有帮助,因为我可以一直从我的第二个设备上写入值,而不需要任何安全检查。( CBAttributePermissionsReadEncryptionRequired的文档显示:
...the特性配置为只允许可信设备读取或订阅其值。当连接的远程中心试图读取或订阅此特性的值时,Core蓝牙尝试将本地外围设备与中心设备配对,以创建安全连接。
对我来说没什么意义。什么是“可信设备”?
有谁可以帮我?什么是只允许连接到具有密码确认的可信设备的最佳实践?
发布于 2015-06-18 02:03:23
您无法阻止发现服务和特性。您可以为一个主要服务做广告,并提供没有广告的辅助服务,但是一旦连接完成,所有的服务和特性都会被显示出来。
如果您指定一个属性需要加密,那么当您第一次尝试读取/写入该特性时,将启动一个配对(技术结合)过程。此过程交换加密密钥,并使设备相互“信任”。
如果您的外围设备和中心设备都是iOS8设备,那么我已经发现,如果两个设备都配置了相同的iCloud帐户,那么信任就已经建立了(想必是用于类似切换的功能),您将永远不会看到配对对话框。当我试图测试加密特性时,这给我带来了相当大的困惑。
如果您测试使用不同iCloud帐户的设备,那么您应该会看到配对对话框。
即使是配对过程也不会“保护”您的服务/特性,如果“攻击者”控制了这两种设备,因为它们可以简单地完成配对过程。配对/绑定可以保护数据不被窃听,因为传输将被加密。
要真正保护服务,在公开数据之前,您需要某种形式的挑战/响应,涉及到某个特性。
例如,中央需要读取由外围设备随机设置的特征"A“的值。然后,中心需要计算对该值的正确响应,并将其写回"A“。只有在此值正确的情况下,外围设备才会对剩余的特征设置值(或者接受来自中央的其他特征的输入)。
这个解决方案只有在您的挑战/响应机制未被破坏的情况下才是安全的,而且可能会击败未确定的攻击者。
https://stackoverflow.com/questions/30905157
复制相似问题