2011-05-04 44 views
30

我可以通过蓝牙将两台设备配对,无需在用户界面中确认此设备,接受配对这些设备。我可以通过例如NFC交换一些额外的数据,然后通过蓝牙安全地将这两个设备配对,而无需任何额外的用户操作?无需用户确认即可进行蓝牙配对

+1

闻起来像安全漏洞,虽然我确信蓝牙技术有很多漏洞。我不确定这是否合法,并且您的应用很可能会从Android Market中删除。 – Phonon 2011-05-04 15:05:48

回答

53

这需要就是为什么createInsecureRfcommSocketToServiceRecord()加入BluetoothDevice中的Android 2.3.3(API等级10)(SDK Docs)开始......之前,有对此没有SDK的支持。它被设计为允许Android连接到无需用户界面输入PIN码的设备(如嵌入式设备),但它可用于在没有用户PIN码输入的情况下在两个设备之间建立连接。

推论方法listenUsingInsecureRfcommWithServiceRecord()BluetoothAdapter用于接受这些类型的连接。这不是安全漏洞,因为这些方法必须成对使用。你不能使用它来简单地尝试与任何旧的蓝牙设备配对。

您也可以通过NFC进行短距离通信,但是在Android设备上该硬件不太显眼。绝对选择一个,而不要尝试创建一个同时使用两者的解决方案。

希望有助于!

P.S.在2.3使用反射之前,在许多设备上也有这样做的方法,因为代码确实存在......但我不一定会推荐这种方法用于大规模分布式生产应用程序。看到这个StackOverflow

+1

嗨,你能告诉我,如果有一些BroadcastReceiver有点可用来知道是否有一些配对设备可用?如果不是,那么我认为,我必须进行定期轮询,其中涉及尝试连接到所需的设备。但连接是一个阻塞呼叫,它也将设置电池收费。 – Mudassir 2012-03-05 08:35:19

+3

你我的朋友是天才。在我的代码中添加一个字(在createInsecureRfcommSocketToServiceRecord()中的“Insecure”)使我的传统蓝牙设备(GPS)立即工作。它不需要PIN码,所以安全连接不起作用。 – mellowg 2012-03-18 03:47:54

-2

如果您在询问您是否可以在没有用户同意配对的情况下配对两台设备,否则无法完成配对,这是一项安全功能。如果您通过蓝牙进行配对,则无需通过NFC交换数据,只需通过蓝牙链接交换数据即可。

我不认为你可以通过在NFC上传送认证数据包来规避蓝牙安全,但我可能是错的。

+1

看来你错了。根据我在本页上阅读的内容,不安全的蓝牙连接可以实现无安全通信,NFC连接可以让两部手机创建一个共享密钥,用于使用对称密码(如AES)对蓝牙通信进行加密。 – Vincent 2012-08-19 05:22:44

2

是的,它在理论上可能是由规范定义的。 但是,目前还没有实际的实施可以实现这一点。

参见:NFC论坛连接切换技术规范 http://www.nfc-forum.org/specs/spec_list/

从说明书关于安全引用 - “的切换协议需要网络访问的数据和证书的传输(载波配置数据)以允许一个设备以连接到另一个设备提供的无线网络由于NFC设备和标签之间通信所需的距离非常近,因此在没有设备合法拥有者的认可的情况下,窃听运营商配置数据是困难的,但并非不可能。配置数据到可以接近的设备在本规范范围内视为合法。“

4

嗯,这确实应该分为两个部分:

  1. 你能对2台蓝牙设备,而无需通过蓝牙配对握手了?不,你不能。这被纳入协议,所以没有办法解决这个问题。
  2. 您可以在没有用户界面的情况下执行握手吗?是的,你可以:这只是代码。

我不知道你如何在Windows土地做到这一点,但在* nix的土地有埋在配合bluez堆栈功能,让您收到出现一个新的设备时有关通知,并把它的配对码(显然必须有这些功能:那些是用户界面使用的)。如果有足够的时间和经验,我敢肯定,你可以弄清楚如何编写自己的蓝牙设置应用程序的版本,不知怎的:

  • 检测到新设备已抵达
  • 看着名称/蓝牙MAC地址并检查了一些内部数据库的配对代码使用。
  • 发送的配对码与操作完成

所有不必弹出一个用户接口。

如果你继续写下代码,我很乐意为此付出代价。

4

简短回答:当我使用OBEX在设备之间发送文件时,几乎从不提示配对,所以它肯定是可行的。

1)应用程序和设备本身都可以设置为需要/不需要验证模式,因此通常不需要配对。例如,大多数OBEX(OPP)服务器根本不需要任何验证,因此不需要配对/绑定。

大概“无线设计”的答案涵盖了这种情况。

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"。不知道Android做什么

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”或“出带外“例如你的NFC建议。

希望帮助...

0

BT版本2.0或更低 - 你应该能够使用标准的PIN码来配对/键,进入编程如1234或0000.这不是很安全,但许多BT设备都是这样做的。

BT版本2.1或更高 - 模式4安全简单配对“正常工作”模式可以使用。它使用椭圆加密(无论是什么),并且非常安全,但可以对中间人攻击开放。与旧的'0000'引脚代码方法相比,它比未来光年轻。这不需要任何用户输入。

这是根据蓝牙规格,但你可以使用什么取决于你的堆栈支持的蓝牙标准的版本和你有什么API。