web-dev-qa-db-ja.com

マイクロコントローラーからサーバーへのデータの安全な送信

Arduino(マイクロコントローラー)からサーバーにデータを安全に転送したい。

明白な解決策はおそらくTLSを使用することですが、arduinoにはそれを実行する機能がありません。

必要な機能(暗号化と認証)を備えたArduinoで実行できる他の軽量実装も見つかりませんでした。

ただし、Arduinoで実行できるAES128-CBCとHMAC-SHA256の両方の実装を見つけました。これらのアルゴリズムを使用したいと思います。

問題は、AESが初期化ベクトルを必要とすることです。これは、マイクロコントローラーを使用して達成するのは困難であり、ハードウェア乱数発生器をひもでつなぎたくありません。

危険ゾーンに入る:

サーバーに生成を依頼してください。

Arduinoとサーバーの両方がメモリに持っている2つのキーがあると仮定します。

  1. ある種のHELLO SERVERパケットをサーバーに送信する
  2. サーバーは/ dev/randomを使用してランダムな初期化ベクトルを生成し、HMAC-SHA256ハッシュを追加して、それをarduinoに送り返します。
  3. ArduinoはHMAC-SHA256ハッシュを使用して受信したIVを検証します。
  4. Arduinoは、AES128-CBC(受信したIVを使用)を使用して平文を暗号化し、HMAC-SHA256を介して実行し、結果のハッシュを暗号文に追加します。
  5. Arduinoは結果をサーバーに送信します
  6. サーバーはHMACを検証し、記憶しているIVを使用して暗号文を復号化します。

これはまったく実行可能な音ですか?

2つの一意の事前共有キーを使用する必要がありますか? 1つはAES用で、もう1つはHMAC用ですか? 1つのキーを使用しても、AESのセキュリティはSHA256に依存するだけですか?

追加のハードウェアなしで私が望むものを達成する他の方法はありますか?

免責事項:これは楽しい学習目的のためだけです:私の温度データはそれほど敏感ではありません。

4
Jaaisto

IV生成をサーバーにオフロードするというあなたの考えは、論理的ですばらしいようです。より安全にするために追加したいことがいくつかあります。

  • 一般的な経験則は ハッシュと暗号化に異なるキーを使用する です。

  • HMAC/AESに使用されるキーが危険にさらされた場合はどうしますか?残念ながら、私にはまだその問題に対する保守/実装が簡単な解決策はありません。

  • 現在のスキームでは、誰かがHELLO SERVERパケットを再生し、サーバーからランダムなIVを生成し続けることができます。 HELLO SERVERメッセージを固定AESキーで暗号化し、パケットでタイムスタンプを送信することで、これを防ぐことができます。

  • すべてのメッセージでタイムスタンプ/ノンスを維持して、誰もあなたの温度値/ IVを再生しないようにすることができます。これには、リプレイ検出のためにクライアントとサーバーにスライディングウィンドウを実装する必要があります。

  • 1つの可能な最適化は、サーバーがクライアントの登録時にAESキーとIVを生成することです。これにより、キーが漏洩した場合でも、すでに登録されているArduinoデバイスは影響を受けません。

上記のすべての点について、セキュリティ/開発者の時間のトレードオフを検討してから、決定を下します。

2
Limit