python-3.x - 如何实现BLE安全?
问题描述
我们通过 BLE 实现了 Linux 设备和移动应用程序之间的通信。我们可以使用免费的应用程序“nRF Connect”来读取和写入数据。现在我们需要支持 BLE 安全性。基本上我们的数据是敏感的。我们希望保护我们的数据免受 MITM 的侵害。因此,我们需要支持合理的高安全标准。看来“安全模式 1,级别 3:经过身份验证的加密配对”是我们需要的。我们的设备不支持视觉输入。我们在 Linux 端使用 BlueZ、D-Bus 和 Python3。
但我有一些实际问题:
- 对于配对,我们如何支持密码保护?这仅适用于移动应用程序开发人员吗?
- 我们如何知道 Linux 端何时发生配对?我们可以从 BlueZ Python API 使用回调或通知吗?
- 数据加密如何工作?有人提到AES-CMAC,有人提到AES-CCM?我们应该使用哪一个?所以我们只需要在 Linux Python 上加密数据并发送数据?
解决方案
- 如果您想在连接到 LE 设备之前启动配对,您必须使用btmgmt 工具设置 le、secure-conn 和bondable 。根据您的硬件支持的 LE 版本,您可以(在某种程度上)进行基于密钥的配对。参考此链接和此链接,如果我们将您的 Linux 设备的 IO 功能指定为 DisplayYesNo(请参阅代理功能),如果硬件支持 LE 4.2 或更高版本,您可以使用密钥比较启动一对。在 LE 版本低于 4.2 的任何其他情况下,您将需要某种方式的键盘输入或显示输出来执行基于密钥的配对。(免责声明:我只尝试过 LE 的旧配对,即 <4.2,它确实需要基于密钥配对的某种输入或输出方式。4.2+ 的结果基于读数)。
- 您必须定义配对代理并使用 Blue Z 代理管理器 API 注册它。每当出现配对密钥请求或提示确认时,您都会收到对注册代理的相应回调。您可以定义在代理实现中应该做什么。您可以在此处参考代理 API和 bluez 测试代码中的示例实现 (test/simple-agent)
- 我认为,当您将特征属性设置为“encrypt-write”或“encrypt-read”时,bluez 会进行加密。我没有太多关于这方面的信息,但你可以参考这个来了解加密在 LE 中是如何工作的,你可以使用一些 hci 日志捕获工具来捕获和分析 hci 数据,并查看在配对过程中各层发生了什么(例如: btmon 捕获 hci 日志)
推荐阅读
- c# - Dapper / SQL Server:仅将 TVP 传递给具有所需字段的存储过程
- c# - 在JQuery中更改动态字符串的3个中间字符的颜色
- angular - 角度 10 - 如何使用 RouterModule
- r - 使用 R 中的 mutate 和 case_when() 语句用 unite() 填充列,整洁的诗句
- tinymce - TinyMCE 可以去掉周围的 html - doctype、html 和 body 标签吗?
- discord.py - discord.py 如何向特定用户发送私人消息
- asp.net - 如何通过 twitter api 按 screenName 检索推文,以便我可以获得推文创建日期、推文和推文媒体?
- c++ - 如何在 std::function 上使用模板扩展
- sql-server - 用于批量插入的文本文件的行终止符
- python - 如何处理 insert_format.format 中的元字符?