1

私は小さな組み込みLinuxボックスから小さな中継局を作成することに取り組んでいます。いくつかのセンサーが接続されており、HTTPPOSTを介してデータをサーバーに転送します。現在、サーバーは、一意のID(eth0のMACアドレス)とともにメッセージを受け入れるだけです。

これを拡張して、ある種のセキュリティを含めたいと思います。最小限の構成でこれらの小さなデバイスを展開できるようにしたいと思います。ベースファームウェアをデバイスにコピーし、フィールドに接続して、自己登録したいと思います。初めて接続するときは、サーバーとデバイスに、指紋を保存できる何らかのネゴシエーションを実行してもらいたいと思います。その後のリクエストでは、その指紋を使用してデバイスを認証/検証できます。

そうすれば、デバイスがその一意のIDで登録されると、そのIDからのすべてのデータが同じデバイスからのものであることが保証されます。ルージュデバイスまたはデバイスのセットが登録されている場合は、それらを削除します(IPを保存して、不明な範囲で削除してブロックできるようにします)。

私の質問は、これを行うための最良の方法は何ですか?SSHフィンガープリントのアイデアを思い出します。ここでは、サーバーに初めて接続したときにサーバーフィンガープリントを取得します。将来のリクエストで別のフィンガープリントが生成された場合、サーバーのキーが実際に再生成された場合(たとえば、古いSSHキーを保存せずに再インストールした場合)、大きな警告が表示され、authorized_keysファイルからフィンガープリントを手動で削除する必要があります。

おそらくHTTPでこのようなものがあり、事前共有キーを使用する必要がない可能性がありますか?

重要な場合、クライアントはPython2を実行しており、接続先のサーバーは主にTomcat上のScalaで記述されています。

4

1 に答える 1

1

基本的に、あなたがする必要があるのは、サーバーに公開鍵を伝えてから、それを使ってすべてのメッセージに署名することです。事前共有キーが必要ない場合、サーバーは、登録している新しい誰かが実際にデバイスの1つであることを保証できません。ただし、メッセージが最初にその識別子で登録されたのと同じデバイスから送信されたことを検証することはできます。

プロセスは基本的に次のようになります。

  1. クライアントは新しいキーペアを生成します(たとえば、RSA公開/秘密キーペア)。
  2. クライアントはサーバーに登録し、公開鍵を送信します。サーバーはこの公開鍵を保存します。
  3. クライアントがメッセージを送信すると、メッセージの署名が生成され、メッセージに添付されます。サーバーはメッセージを受信すると、署名を検証して、対応する秘密鍵を保持している誰かがメッセージを送信したことを確認します。

PyCryptoのこのコードは、次のようになります。

キーペアを生成する

from Crypto.PublicKey import RSA
key = RSA.generate(2048)
private_key = key.exportKey()
public_key = key.publickey().exportKey()
# private_key is a string suitable for storing on disk for retrieval later
# public_key is a string suitable for sending to the server
# The server should store this along with the client ID for verification

署名を生成する

from Crypto.PublicKey import RSA
from Crypto.Hash import SHA
key = RSA.importKey(private_key)
# where private_key is read from wherever you stored it previously
digest = SHA.new(message).digest()
signature = key.sign(digest, None)
# attach signature to the message however you wish

サーバーは、以前に保存された公開鍵をロードし、使用するScala / Java暗号化APIによって提供される「検証」メソッドを使用し、成功した場合にのみメッセージを受け入れる必要があります。

さまざまな手法は特定の種類の攻撃からのみ保護するため、各アプローチの警告を理解することが重要です。たとえば、上記のアプローチは、攻撃者が特定の意味を持つメッセージを記録し、後でそれをサーバーに再送信する「リプレイ攻撃」から保護しません。これを防ぐ1つの方法は、ハッシュされるメッセージにタイムスタンプを含めることです。もう1つは、適切に暗号化されたトランスポート(SSL / TLSなど)を使用することです。

于 2011-07-27T22:48:57.310 に答える