- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在研究低功耗蓝牙 (BLE) 协议(protocol) (v4.2),尤其是它的安全功能。我正在尝试了解移动应用程序和 BLE 设备之间传输的数据加密的工作原理。
官方文档(v4.2)指定了加密数据、验证设备、生成加密和配对阶段使用的 key 等方法。
第一个疑问(我想确定已经理解了一些概念):所有这些功能都在主机级别实现,所以如果我想加密应用程序(Android)和 BLE 设备(如健身追踪器)之间传输的数据,我必须在 BLE 设备上实现(或启用)这些方法吗?这样,开发人员应该只关心这些功能在 BLE 设备上的实现,因为 Android 蓝牙堆栈只支持这些功能。我对吗?如果我错了,实现这些功能的正确方法是什么(在移动应用程序和 BLE 设备上)?
第二个疑点:为什么一些 BLE 设备在 GATT 协议(protocol)之上实现自己的加密,而不是使用 SIG 提供的安全功能?
第三个也是最后一个疑问:SIG 指定的安全功能是强制性的还是可选的?
如您所见,我有一些疑问,也许有些问题可能很愚蠢,所以如果有人可以阐明如何在 App 和 BLE 设备之间实现安全机制(如加密),以及在哪些级别(操作系统或应用程序级别)实现这些功能,我将非常感激。
最佳答案
如果您使用标准的 BLE 加密,实际上是 Controller 的链路层执行加密/解密/验证身份验证标签。但它是定义两个设备如何配对、绑定(bind)和交换 key 的主机层 (SMP)。也是该层告诉链路层使用交换的 key 开始加密。在 Android 和 iOS 上,操作系统负责管理配对和绑定(bind)并实现 SMP。是否使用蓝牙配对/绑定(bind)/加密完全取决于设备,并且是可选的。如果不支持它必须仍然支持发送错误代码“不支持配对”
蓝牙标准只有一个“用例”。此用例旨在提供一种方法来保护两个设备之间的链接,以便在绑定(bind)后,任何人都不能冒充设备或能够操纵或解密流量。您可能知道,“LE Legacy Pairing”是蓝牙 v4.1 之前指定的唯一配对方法,它有几个缺陷,如果攻击者在配对期间嗅探流量(“Just works”和“MITM/密码条目”,但不是 OOB)。然而,由蓝牙 v4.2 定义的新“LE 安全连接”使用 Diffie Hellman 使其更加安全。
尽管蓝牙配对本身提供了安全性,但如果需要良好的安全性,Android API 和 iOS API 中都存在一些缺陷,对于应用程序开发人员而言,这些缺陷可能仍然不够。值得注意的是,iOS 不提供任何 API 来检测给定设备是否实际绑定(bind)或链接是否加密。然而,它确实会在配对开始时向用户显示一个弹出窗口,但该应用程序对该配对一无所知。因此,从 iOS 应用的角度来看,您不知道:
Android 稍微好一点。在那里,应用程序至少可以知道设备是否绑定(bind)(但不知道其他三个)。还有一个 API“createBond”来启动绑定(bind)过程。 Windows API 在这里要好得多,因为您可以在执行 GATT 操作时强制执行加密链接。
任何这些原因都足以让开发人员改为在 GATT 之上从头开始实现安全性。特别是一个经常常见的用例是开发人员希望使用 PIN 或密码“登录到外围设备”的用例。蓝牙标准不以任何方式支持该用例(不,使用“MITM 保护配对与静态密码”不起作用,因为该协议(protocol)设计在一个或几个之后显示密码尝试)。
不管怎样,如果你用自己的硬件开发自己的外设,想要使用蓝牙标准的配对/绑定(bind)/加密,BLE芯片厂商的SDK通常已经实现了。但是,您仍然需要正确设置它才能正常工作。通常你只需要配置一些参数(比如如果你有显示器或者用户可以输入密码)然后剩下的由他们的 SDK 在内部自动处理。
更新:
Android 的源代码可以在https://android.googlesource.com/platform/system/bt/ 找到。 , https://android.googlesource.com/platform/packages/apps/Bluetooth/和 https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/bluetooth .
关于android - 低功耗蓝牙安全性如何在 Android 应用程序和 BLE 设备之间发挥作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44472500/
iphone设备UDID、iphone设备ID和iphone设备Token之间有什么区别? 通常,当我们使用苹果推送通知服务时,会使用 iPhone 设备 token 。 但我的目标只是识别唯一的 i
我们使用 firebase 从服务器向 Android 和 IOS 设备发送通知,并且我们使用旧版 FCM 发送通知。但是当我们的应用程序在后台时,通知由系统本身处理,因此我们无法通过应用程序处理它。
在 Google 上搜索后,我发现人们说只能通过“MFi 程序”将 iOS 设备与非 iOS 设备连接起来。这是真的吗? 我的项目主要集中于直接通过蓝牙与Arduino设备发送和接收信息。 iOS和非
所以我有一个通用应用程序,我正在设置 UIScrollView 的内容大小。显然,iPhone 和 iPad 上的内容大小会有所不同。如何为 iPad 设置某种尺寸,为 iPhone 和 iPod t
问题:如何在 pod 中使用连接到主机的原始设备作为 block 设备。 我尝试使用类型为“BlockDevice”的“hostPath” volumes: - my-data: hostPath
Implemented GCKDeviceScannerListener Singleton Class on ViewController, however its delegate methods
我有一个 (PhoneGap) 应用程序,它将成功获得 Passbook 通行证,并且还将成功接收与 Passbook 分开的推送通知(当伪造设备 ID 时)。 我遇到的问题是发送给注册设备的设备 I
我正在尝试找到一种方法,通过我目前正在使用的 iOS 应用程序访问我的信标的电池电量。我正在使用 Kontakt 的 iBeacon 设备。我浏览了 Estimote iOS SDK,他们提供了一种实
我正在努力让 CUDA 应用程序也能监控 GPU 的核心温度。可通过 NVAPI 访问该信息。 问题是我想确保在运行代码时监控的是同一个 GPU。 但是,似乎有信息表明我从 NvAPI_EnumPhy
从沙箱模式到生产模式,设备 token 有何不同? 我认为我已将一些设备 token 锁定为生产模式,并且无法将它们从开发中插入。 关于如何检查有什么想法吗? 最佳答案 当您使用开发证书构建应用程序时
目录 /run/user/1000/gvfs 和 ~/.gvfs 分别是空的和不存在的。我的图形文件管理器 (Thunar) 能够检测和访问设备的内部和外部存储器。 命令 gvfs-mount -l
我有一个 Android 平板电脑,它有一个迷你 USB 端口和一个 USB 端口,我想编写一个与 USB key 通信的应用程序。我写了一个demo来找出U盘,但是没有任何反应。 令我不安的是,如果
我们将 PHP 版本从 5.4.25 更改为 5.4.45,并在服务器上安装了 MS SQL 驱动程序。在更改服务器之前,一切正常,但在更改服务器之后,我遇到了 Web 服务问题。我们的身份验证 So
我想知道是否有人使用此 API 在 Android 设备上同时从 2 个后置摄像头捕获图像或视频:https://source.android.com/docs/core/camera/concurr
我正在为客户构建一个物联网解决方案,网络管理员坚持要求设备仅通过访客网络进行连接,该网络有一个强制门户,其中的服务条款必须通过按下 UI 按钮来接受,然后才能获得外部互联网访问。到目前为止,我见过的大
我无法弄清楚这里的格式规则..在我的示例中,代码行太多,无法为每行添加 4 个空格,因此这里是我需要帮助的代码的链接 http://nitemsg.blogspot.com/2011/01/heres
如果我在我的设备上接受推送通知,并且不保存设备 token ,那么我如何在自定义 View 中查看设备 token 或恢复警报 View ? 我删除了应用程序并重新安装,但看不到设备 token 警报
我试图找出在尝试并行比较和复制设备 block 与 pthreads 时我做错了什么。看起来我正在脱离同步并且比较阶段无法正常工作。任何帮助将不胜感激 #ifndef __dbg_h__ #defin
我刚刚写完所有这些内容,但这个红色的小栏告诉我我不能发布图片或两个以上的链接。因此,如果您可以引用 this Imgur album , 那简直太好了。谢谢。 我在这里相对较新,甚至对 android
我需要启用 mysql 常规日志并将其通过 nsf 移动到我系统中的另一个驱动器/设备! 所以,我在 my.cnf 中启用了它: general_log = 1 general_log_fi
我是一名优秀的程序员,十分优秀!