无需用户确认的蓝牙配对
Posted
技术标签:
【中文标题】无需用户确认的蓝牙配对【英文标题】:Bluetooth pairing without user confirmation 【发布时间】:2011-05-04 14:56:17 【问题描述】:我是否可以通过蓝牙将两个设备配对而无需在用户界面中确认,接受配对此设备。我是否可以通过 NFC 等方式交换一些额外数据,然后通过蓝牙安全地将这两个设备配对,而无需任何额外的用户操作?
【问题讨论】:
闻起来像安全漏洞,尽管我确信蓝牙技术有很多漏洞。不过我不确定这是否合法,您的应用程序很可能会从 android Market 中删除。 【参考方案1】:这正是从 Android 2.3.3(API 级别 10)(SDK Docs) 开始将 createInsecureRfcommSocketToServiceRecord()
添加到 BluetoothDevice
的原因...在此之前没有 SDK 支持。它旨在允许 Android 连接到没有用于输入 PIN 码的用户界面的设备(如嵌入式设备),但它同样可用于在没有用户 PIN 输入的情况下在两台设备之间建立连接。
BluetoothAdapter
中的推论方法listenUsingInsecureRfcommWithServiceRecord()
用于接受这些类型的连接。这不是安全漏洞,因为这些方法必须成对使用。您不能使用它来简单地尝试与任何旧蓝牙设备配对。
您还可以通过 NFC 进行短距离通信,但这种硬件在 Android 设备上不太突出。一定要选择一个,不要试图创建一个同时使用两者的解决方案。
希望有帮助!
附:还有一些方法可以在 2.3 之前的许多设备上使用反射来执行此操作,因为代码确实存在……但我不一定会推荐这种用于大规模分布式生产应用程序的方法。看到这个***。
【讨论】:
嗨,你能告诉我,如果有一些 BroadcastReceiver 可以知道是否有配对设备可用?如果不是那么,我认为,我必须进行定期轮询,其中涉及尝试连接到所需的设备。但 connect 是一个阻塞调用,它也会设置电池费用。 你我的朋友是个天才。在我的代码中添加一个词(“不安全”,如 createInsecureRfcommSocketToServiceRecord())使我的旧蓝牙设备 (GPS) 立即工作。它不需要 PIN 码,因此安全连接不起作用。【参考方案2】:嗯,这真的应该分成两部分:
-
能否在不通过蓝牙配对握手的情况下配对 2 个蓝牙设备?不,你不能。这已被纳入协议,因此无法解决。
您可以在没有用户界面的情况下执行握手吗?是的,您可以:这只是代码。
我不确定您在 Windows 领域是如何做到的,但在 *nix 领域中,Bluez 堆栈中隐藏了一些函数,可让您接收有关何时出现新设备的通知,并将配对代码发送给它(显然在必须是这些功能:那些是用户界面使用的)。如果有足够的时间和经验,我相信您可以弄清楚如何编写自己的蓝牙设置应用程序版本:
检测到新设备到货 查看名称/蓝牙 MAC 地址并检查一些内部数据库以查找要使用的配对代码。 发送配对码并完成操作全部无需弹出用户界面。
如果您继续编写代码,我很想亲自动手。
【讨论】:
嗨,即使你有点兴奋,我也愿意。我目前正在科尔多瓦从事这项工作。如果您有空,我们可以这样做。【参考方案3】:简短回答:当我使用 OBEX 在设备之间发送文件时,我几乎不会被提示配对,所以这当然是可能的。
1) 应用程序和设备本身都可以设置为需要/不需要身份验证模式,因此通常不需要配对。例如,大多数 OBEX (OPP) 服务器根本不需要任何身份验证,因此不需要配对/绑定。
大概“Wireless Designs”的答案是涵盖那个案例。
2) 如果设备/应用需要配对:
2.1) 在 v2.1 之前的配对中,两个设备需要具有匹配的密码/PIN。因此,这要么需要用户参与(输入 PIN),要么需要了解 PIN 的软件知识:要么在应用程序 if pin callback send pin="1234"
中定义,要么在 BlueZ 和 Win7 等操作系统中的智能(参见 Slide 20 at my Bluetooth in Windows 7 doc),其逻辑如下: if(remotedevice=headset) then expectedPin ="0000"
。不知道安卓是做什么的
2.2) 在 v2.1 中添加了安全简单配对 (SSP)。将配对更改为:
if (either is pre-v2.1) then Legacy else if (Out-Of-Band channel) then OutOfBand else if (neither have "Man-in-the-Middle Protection Required") then (i.e. both have "Man-in-the-Middle Protection _Not_ Required") Just-Works else Depending on the two devices' "IO Capabilities", either NumericComparison or Passkey. Passkey is used when one device has KeyboardOnly -- and the peer device _isn't_ NoInputNoOutput. endif
来自32feet.NET's BluetoothWin32Authentication user guide,另请参阅 [1] 中的 SSP 部分
因此,要自动配对需要“JustWorks”或“Out-of-Band”,例如您的 NFC 建议。
希望对您有所帮助...
【讨论】:
【参考方案4】:是的,按照规范的定义,理论上是可能的。 但是,目前还没有实际的实现可以允许这样做。
参考:NFC Forum Connection Handover Technical Specification http://www.nfc-forum.org/specs/spec_list/
引用关于安全性的规范 - “切换协议要求传输网络访问数据和凭据(运营商配置数据),以允许一个设备连接到另一个设备提供的无线网络。由于 NFC 设备和标签之间的通信需要非常接近,如果没有设备的合法所有者的认可,窃听运营商配置数据是困难的,但并非不可能。在本规范的范围内,将运营商配置数据传输到可以靠近的设备被认为是合法的。”
【讨论】:
【参考方案5】:BT 2.0 或更低版本 - 您应该能够使用标准 PIN 码配对/绑定,以编程方式输入,例如1234 或 0000。这不是很安全,但许多 BT 设备都这样做。
BT 2.1 或更高版本 - 可以使用模式 4 安全简单配对“正常工作”模型。它使用椭圆加密(无论是什么)并且非常安全,但对中间人攻击是开放的。与旧的“0000”密码方法相比,它提前了数年。这不需要任何用户输入。
这是根据蓝牙规范,但您可以使用什么取决于您的堆栈支持的蓝牙标准版本以及您拥有的 API。
【讨论】:
【参考方案6】:如果您询问是否可以在没有用户批准配对的情况下配对两台设备,不,这是一项安全功能。如果您通过蓝牙配对,则无需通过 NFC 交换数据,只需通过蓝牙链接交换数据即可。
我认为您不能通过通过 NFC 传递身份验证数据包来规避蓝牙安全性,但我可能错了。
【讨论】:
看来你错了。根据我在此页面上阅读的内容,不安全的蓝牙连接可以实现没有安全性的通信,而 NFC 连接可以让两部手机创建一个共享密钥,该密钥可用于使用 AES 等对称密码对蓝牙通信进行加密。跨度>以上是关于无需用户确认的蓝牙配对的主要内容,如果未能解决你的问题,请参考以下文章