如何使用 Bluez5.50 使用 BLE 连接加密数据
Posted
技术标签:
【中文标题】如何使用 Bluez5.50 使用 BLE 连接加密数据【英文标题】:How to encrypt data using BLE connection using Bluez5.50 【发布时间】:2019-06-19 12:26:40 【问题描述】:我正在开发一个处理数据传输的 C++ 项目。我的系统由两个不同的设备组成,它们必须以受信任的模式交换敏感数据。为此,我在 Raspberry Pi 上下载并设置了最后一个 bluez 库 (v5.50)。
-
是否有可能使用 bluez API 启用数据加密?
围绕使用 BLE 加密机制的可能性进行谷歌搜索,我发现意见不一致。有人建议使用它,而另一些人则反对它,支持应用程序级加密利用,例如 Cripto++ 库。
-
最佳解决方案是什么?
谢谢
【问题讨论】:
我对蓝牙了解不多,但如果我有保护敏感数据的需求,那么我不会依赖某些链路级协议并宣称,“工作完成!”我会研究threat model,我会选择合适的加密算法,并确保我的软件(可能还有硬件)是secure by design。当您承诺保护用户的敏感数据时,您打开了huge can of worms。 @SolomonSlow 感谢您的及时重播。如果我理解正确,链路层加密机制不是正确的解决方案。无论如何,为了提供有关我的系统的一些新细节,蓝牙连接应该用于发送有关 Wi-Fi ssid 和密码的信息。那么,您是否建议使用多级加密机制? 一个有技术能力和时间和精力窃听蓝牙链接的人,是一个可能会尝试其他技巧来获取您数据的人。例如,如果坏人可以窃取您的设备,他可以使用cold boot attack 或other ways 来绕过设备的密码保护。我的意思是,在数据通过空中传输时对其进行加密只是更大的数据安全问题的一部分。 【参考方案1】:我的建议是始终加密连接。请参阅this answer,它解释了加密连接与开放连接的优势和重要性。
关于加密连接,您可以通过与设备配对轻松完成此操作。在 BLE 中,配对允许对连接数据包进行加密。使用 BlueZ,您可以使用 bluetoothctl 命令轻松地从命令行执行此操作,如下所示:-
bluetoothctl
[bluetoothctl] connect 00:11:22:33:44:55
[bluetoothctl] pair 00:11:22:33:44:55
在此之前,请确保您的 BlueZ 设备可以执行/接受连接和配对,如下所示:-
btmgmt connectable on
btmgmt bondable on
btmgmt io-cap
btmgmt 3
最后一个命令将您的 IO 能力设置为 NoInputNoOutput,但您可以将其更改为以下值之一:-
0 DisplayOnly
1 DisplayYesNo
2 KeyboardOnly
3 NoInputNoOutput
4 KeyboardDisplay
但是,如果您这样做,则需要在启动 bluetoothctl 时传递等效的命令行选项,如下所示:-
bluetoothctl --agent KeyboardOnly
bluetoothctl --agent KeyboardDisplay
bluetoothctl --agent NoInputNoOutput
bluetoothctl --agent DisplayOnly
如果你想查看底层API,请查看BlueZ source code,你可以从client/main.c开始连接和配对命令。
最后,正如 Solomon Slow 所指出的,如果您承诺保护敏感数据,那么您绝对应该采用多级加密。换句话说,链接和数据在软件中发送之前都应该被加密,如果你的设备支持硬件级加密,那么也应该这样做。
如需进一步了解 BLE 加密,请访问Bluetooth Specification 5.0 版,第 2 卷,H 部分,第 1 节:安全概述。
我希望这会有所帮助。
【讨论】:
@Yossif 感谢您的回复。我也花了一些时间分析你建议给我的示例代码,这对启动项目很有用。顺便说一句,有些事情仍未解决。特别是,您能否建议我在 bluez 库中使用利用 DBus 的链路层加密的一些具体点? @AV28 不幸的是,我没有太多使用底层 DBUS API 的经验。但是,一个好的起点是这里的文档目录:- github.com/Vudentz/BlueZ/tree/master/doc以上是关于如何使用 Bluez5.50 使用 BLE 连接加密数据的主要内容,如果未能解决你的问题,请参考以下文章