web-dev-qa-db-ja.com

ArduinoからAndroid安全なBluetooth接続へ

私はArduino Unoと AdafruitのnRF8001ボード を使用してAndroid Bluetooth経由の電話に接続します。これを使用してロックをロックおよびロック解除し、確認済みのデバイスのみがロックとロック解除を開始できることを確認する必要があります。たくさんの場所を検索しましたが、接続デバイスを確認するために何をすべきかについて明確な例を見つけるのに苦労しています。現在、Arduinoを持っていますロックに接続され、Android電話が接続するたびに、ロックとロック解除が許可されます。

私は暗号化にかなり慣れていないので、いくつかのガイダンスが役に立ちます。私が読んだことから、md5ハッシュは壊れているようであり、私の問題の正しい解決策ではないようです。私は SipHash を見つけました。これは、私が必要とする最も近いもののようです。私が考えていたプロセスは次のとおりです。

  1. AndroidはArduinoへの接続を試みます
  2. Arduinoはリクエストを確認し、ランダムな文字列をAndroidデバイスに送信します
  3. Androidは、共有秘密鍵で文字列を暗号化し、Arduinoに送り返します
  4. Arduinoは暗号化された文字列を復号化し、それが送信したオリジナルと一致することを確認します。一致する場合は、ロックまたはロック解除を行って接続/続行します。

私はSipHashと上記のプロセスで正しい軌道に乗っていますか?これを行うより一般的な方法はありますか?ここを検索したところ、いくつかの情報が見つかりました here。 中間者攻撃やMACスプーフィングを心配する必要があるようです。確認としてMACアドレスを確認するだけですが、覚えている限りでは、MACアドレスを偽装するのは非常に簡単です。任意の助けいただければ幸いです。

3
BlueBeardo

あなたは正しい考え、つまり、あるデバイスから別のデバイスに決して送信されない共有秘密を持っています。その場合は、MACアドレスやMITM攻撃について心配する必要はありません。攻撃者が共有秘密を取得できる場合にのみ、脆弱になります。

共有シークレットは{ahem}キーであるため、個別に生成できないことを確信する必要があります。これを行う1つの方法は、暗号的に安全な疑似乱数ジェネレータ( [〜#〜] csprng [〜#〜] )で生成することです。 Diceware の使用を検討することもできます。これはやや人間にやさしいですが、同等のエントロピーを得るには長い文字列が必要になります。

さて、実際のアルゴリズムについて:SipHashは初めてですが、少し読んでみると、それがキー付きハッシュ関数であることがわかります。つまり、それは可逆的ではないので、ステップ4は作成したとおりに機能しません。

SipHashが指定されている場合、ステップ3は「Androidが共有秘密鍵で文字列をハッシュし、それをArduinoに送り返す」です。

ステップ4が本当の違いです。「Arduinoは同じハッシュを計算し、それがAndroidから受け取ったハッシュと一致することを確認します。それが一致する場合は、先に進み、ロックまたはロック解除で接続/続行します。」

または、AESなどの対称暗号化を使用することもできます。少しグーグルでArduino用のAESライブラリを見つけましたが、Android用に存在することは知っています。

2
Bob Brown