如何实现与 CBPeripheral 的安全连接?
How to implement secure connection to CBPeripheral?
我只希望受信任的设备连接到我的外围设备。而且我不希望任何人能够发现我的外围设备的服务和特征。
因此,在连接到外围设备之前,我想显示一个带有 pin 码的警报。有可能做到吗?最简单的方法是什么?
我找不到这个问题的答案,尝试通过在权限中添加 CBAttributePermissionsWriteEncryptionRequired 来实现加密特性:
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.
这对我来说没有意义。这里的 "trusted devices" 是什么?
谁能帮帮我?仅允许来自具有 PIN 码确认的受信任设备的连接的最佳做法是什么?
您无法阻止服务和特征被发现。您可以公布主要服务并拥有未公布的次要服务,但一旦建立连接,所有服务和特征都将显示。
如果您指定某个属性需要加密,那么当您首次尝试 read/write 该特征时,将启动配对(技术上绑定)过程。此过程交换加密密钥并导致设备 'trusting' 彼此。
如果你的外围设备和中央设备都是 iOS8 设备,那么我发现如果两个设备都配置了相同的 iCloud 帐户,那么信任已经建立(大概是为了实现这样的切换功能),你将永远看不到配对对话框。当我尝试测试加密特性时,这让我很困惑。
如果您使用具有不同 iCloud 帐户的设备进行测试,那么您应该会看到配对对话框。
即使 "protect" 您的 service/characteristic 如果 "attacker" 可以控制两个设备,即使配对过程也不会,因为它们可以简单地完成配对过程。 Pairing/bonding 确实保护数据免遭窃听,因为传输将被加密。
要真正保护服务,您需要某种形式的 challenge/response 涉及在公开数据之前的特征。
例如,中央需要从外设随机设置的特性"A"中读取一个值。然后中央需要计算对该值的正确响应并将其写回 "A"。仅当此值正确时,外围设备才会对其余特性设置值(或接受来自中央的其他特性的输入)。
只要您的 challenge/response 机制没有受到损害,此解决方案就是安全的,但可能会击败不确定的攻击者。
我只希望受信任的设备连接到我的外围设备。而且我不希望任何人能够发现我的外围设备的服务和特征。 因此,在连接到外围设备之前,我想显示一个带有 pin 码的警报。有可能做到吗?最简单的方法是什么?
我找不到这个问题的答案,尝试通过在权限中添加 CBAttributePermissionsWriteEncryptionRequired 来实现加密特性:
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.
这对我来说没有意义。这里的 "trusted devices" 是什么?
谁能帮帮我?仅允许来自具有 PIN 码确认的受信任设备的连接的最佳做法是什么?
您无法阻止服务和特征被发现。您可以公布主要服务并拥有未公布的次要服务,但一旦建立连接,所有服务和特征都将显示。
如果您指定某个属性需要加密,那么当您首次尝试 read/write 该特征时,将启动配对(技术上绑定)过程。此过程交换加密密钥并导致设备 'trusting' 彼此。
如果你的外围设备和中央设备都是 iOS8 设备,那么我发现如果两个设备都配置了相同的 iCloud 帐户,那么信任已经建立(大概是为了实现这样的切换功能),你将永远看不到配对对话框。当我尝试测试加密特性时,这让我很困惑。
如果您使用具有不同 iCloud 帐户的设备进行测试,那么您应该会看到配对对话框。
即使 "protect" 您的 service/characteristic 如果 "attacker" 可以控制两个设备,即使配对过程也不会,因为它们可以简单地完成配对过程。 Pairing/bonding 确实保护数据免遭窃听,因为传输将被加密。
要真正保护服务,您需要某种形式的 challenge/response 涉及在公开数据之前的特征。
例如,中央需要从外设随机设置的特性"A"中读取一个值。然后中央需要计算对该值的正确响应并将其写回 "A"。仅当此值正确时,外围设备才会对其余特性设置值(或接受来自中央的其他特性的输入)。
只要您的 challenge/response 机制没有受到损害,此解决方案就是安全的,但可能会击败不确定的攻击者。