Arduino(マイクロコントローラー)からサーバーにデータを安全に転送したい。
明白な解決策はおそらくTLSを使用することですが、arduinoにはそれを実行する機能がありません。
必要な機能(暗号化と認証)を備えたArduinoで実行できる他の軽量実装も見つかりませんでした。
ただし、Arduinoで実行できるAES128-CBCとHMAC-SHA256の両方の実装を見つけました。これらのアルゴリズムを使用したいと思います。
問題は、AESが初期化ベクトルを必要とすることです。これは、マイクロコントローラーを使用して達成するのは困難であり、ハードウェア乱数発生器をひもでつなぎたくありません。
危険ゾーンに入る:
サーバーに生成を依頼してください。
Arduinoとサーバーの両方がメモリに持っている2つのキーがあると仮定します。
これはまったく実行可能な音ですか?
2つの一意の事前共有キーを使用する必要がありますか? 1つはAES用で、もう1つはHMAC用ですか? 1つのキーを使用しても、AESのセキュリティはSHA256に依存するだけですか?
追加のハードウェアなしで私が望むものを達成する他の方法はありますか?
免責事項:これは楽しい学習目的のためだけです:私の温度データはそれほど敏感ではありません。
IV生成をサーバーにオフロードするというあなたの考えは、論理的ですばらしいようです。より安全にするために追加したいことがいくつかあります。
一般的な経験則は ハッシュと暗号化に異なるキーを使用する です。
HMAC/AESに使用されるキーが危険にさらされた場合はどうしますか?残念ながら、私にはまだその問題に対する保守/実装が簡単な解決策はありません。
現在のスキームでは、誰かがHELLO SERVERパケットを再生し、サーバーからランダムなIVを生成し続けることができます。 HELLO SERVERメッセージを固定AESキーで暗号化し、パケットでタイムスタンプを送信することで、これを防ぐことができます。
すべてのメッセージでタイムスタンプ/ノンスを維持して、誰もあなたの温度値/ IVを再生しないようにすることができます。これには、リプレイ検出のためにクライアントとサーバーにスライディングウィンドウを実装する必要があります。
1つの可能な最適化は、サーバーがクライアントの登録時にAESキーとIVを生成することです。これにより、キーが漏洩した場合でも、すでに登録されているArduinoデバイスは影響を受けません。
上記のすべての点について、セキュリティ/開発者の時間のトレードオフを検討してから、決定を下します。