web-dev-qa-db-ja.com

ユーザー確認なしのBluetoothペアリング

ユーザーインターフェイスでこれを確認する必要なく、Bluetooth経由で2つのデバイスをペアリングできますか? NFCなどを介していくつかの追加データを交換し、追加のユーザー操作なしでBluetoothを介してこれら2つのデバイスを安全にペアリングできますか?

32
michael

この必要性こそ、createInsecureRfcommSocketToServiceRecord()BluetoothDeviceに追加された理由です。Android 2.3.3(API Level 10)( SDK Docs )...これに対するSDKのサポートはありませんでした。Androidは、PINコードを入力するためのユーザーインターフェイスなしでデバイスに接続できるように設計されました(組み込みデバイスのように)、ユーザーPINエントリなしで2つのデバイス間の接続をセットアップするのに使用できます。

BluetoothAdapterの結果メソッドlistenUsingInsecureRfcommWithServiceRecord()は、これらのタイプの接続を受け入れるために使用されます。メソッドはペアとして使用する必要があるため、セキュリティ違反ではありません。これを使用して、単に古いBluetoothデバイスとペアリングを試みることはできません。

NFCを介して短距離通信を行うこともできますが、そのハードウェアはAndroidデバイスではあまり目立ちません。間違いなく1つを選択し、両方を使用するソリューションを作成しないでください。

お役に立てば幸いです!

追伸コードが存在していたため、2.3より前の多くのデバイスでリフレクションを使用してこれを行う方法もありますが、大量に配布される実稼働アプリケーションには必ずしもお勧めしません。こちらをご覧ください StackOverflow

53
Devunwired

さて、これは本当に2つの部分に分けられるはずです。

  1. Bluetoothペアリングハンドシェイクを行わずに2つのBluetoothデバイスをペアリングできますか?いいえ、できません。これはプロトコルに組み込まれているため、これを回避する方法はありません。
  2. ユーザーインターフェイスなしでハンドシェイクを実行できますか?はい、できます:それは単なるコードです。

Windowsのランドでどのように行うかはわかりませんが、* nixのランドには、新しいデバイスが表示されたときに通知を受け取り、ペアリングコードを送信できるようにする関数がBluezスタックに埋め込まれています(明らかに、これらの機能:これらはユーザーインターフェイスが使用するものです)。十分な時間と経験があれば、何らかの方法で次のようなBluetooth設定アプリの独自バージョンを作成する方法を理解できると確信しています。

  • 新しいデバイスが到着したことを検出しました
  • Name/bluetooth macアドレスを見て、使用するペアリングコードの内部データベースを確認しました。
  • ペアリングコードを送信し、操作を完了しました

すべて、ユーザーインターフェイスをポップアップする必要はありません。

あなたが先に進んでコードを書くなら、私はそれを手に入れるのが大好きです。

6
Femi

簡単な答え:OBEXを使用してデバイス間でファイルを送信するとき、ペアリングするように求められることはほとんどないので、確かに可能です。

1)アプリケーションとデバイス自体をそれぞれ認証モードが必要/不要に設定できるため、多くの場合、ペアリングの要件はありませんでした。たとえば、ほとんどのOBEX(OPP)サーバーは認証をまったく必要としないため、ペアリング/ボンディングは必要ありません。

おそらく「Wireless Designs」の答えはそのケースをカバーしていた。

2)次に、デバイス/アプリでペアリングが必要な場合:

2.1)v2.1より前のペアリングでは、2つのデバイスに一致するパスフレーズ/ PINが必要でした。そのため、これにはユーザーの関与(PINを入力する)またはPINを知るためのソフトウェアの知識が必要でした:アプリで定義された_if pin callback send pin="1234"_、またはBlueZやWin7などのOSのスマート( を参照) Windows 7のBluetoothでスライド20(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のBluetoothWin32Authenticationユーザーガイド から、[ 1 ]のSSPセクションも参照してください。

したがって、ペアリングをプロンプトなしにするには、「JustWorks」または「Out-of-Band」のいずれかが必要です(例:NFC)。

お役に立てば幸いです...

4
alanjmcf

はい、仕様で定義されているように理論​​的には可能です。ただし、これを可能にする実用的な実装はまだありません。

参照:NFC Forum Connection Handover Technical Specification http://www.nfc-forum.org/specs/spec_list/

セキュリティに関する仕様から引用-」 NFCデバイスとタグ間の通信に必要な近接性のため、デバイスの正当な所有者に認識されない限り、キャリア構成データの盗聴は困難ですが、不可能ではありません。キャリア構成データの送信近接させることができるデバイスに対しては、この仕様の範囲内で合法であると見なされます。」

2
Xabi

BTバージョン2.0以下-標準のPINコードを使用してペアリング/ボンディングできる必要があります。たとえば、1234または0000などのプログラムで入力します。これはあまり安全ではありませんが、多くのBTデバイスはこれを行います。

BTバージョン2.1以降-モード4セキュアシンプルペアリング「ジャストワークス」モデルを使用できます。楕円形の暗号化(それが何であれ)を使用し、非常に安全ですが、Man In The Middle攻撃に対して開かれています。古い「0000」ピンコードアプローチと比較すると、数年先のことです。これにはユーザー入力は必要ありません。

これはBluetoothの仕様によるものですが、使用できるものは、スタックがサポートしているBluetooth標準のバージョンと使用しているAPIによって異なります。

0
Simon Peverett