1

したがって、C1 と C2 の 2 つのクライアントがあり、各クライアントには GUID が関連付けられているとします。

C1 から送信されたと思われるメッセージを C2 で受信した場合(GUID をチェックし、それが C1 の GUID と一致することを確認することによって)、メッセージが C1 から送信されたことが保証されていないため (C3 が送信した可能性があるため)、どうすればよいでしょうか。メッセージ ヘッダーで C1 の GUID を送信するメッセージ)、メッセージが実際に C1 から送信されたことを確認する必要があります。

私は、非対称暗号化 (RSA) を使用して、C1 に で構成されるメッセージを送信[C1.GUID; RSAEncrypt(C2.PUBLIC_KEY, C1.GUID); MESSAGE]させ、次に C2 に基本的に次のようなチェックを行わせることを検討しています (python 擬似コード):

message.GUID == RSADecrypt(C2.PRIVATE_KEY, message.ENCRYPTED_GUID)

これは実行可能なアプローチですか?または、メッセージの送信者を確認するための他の賢い/より明白な方法はありますか?

4

4 に答える 4

2

非対称アルゴリズムはそのような目的のために発明されました。それがデジタル署名の仕組みです。

ただし、あなたのアプローチにはいくつかの問題があります。受信者の公開鍵を持っていれば誰でも署名を偽造できます。また、サインは一切変わりません!メッセージを傍受する人は誰でも、有効な送信者になりすますことができます。非対称暗号化の目的は、鍵交換でこれらの問題を克服することです。デジタル署名の概念があります。これは、基本的に、あなたが投げかけているメッセージの非対称的に暗号化されたハッシュです。

RSA の場合、基本アルゴリズムからデジタル署名を作成するために、もう少し作業を行う必要があります。詳細については、ウィキペディアを参照してください: http://en.wikipedia.org/wiki/RSA#Signing_messages

ライブラリのデジタル署名アルゴリズムを使用するだけです。Python の場合、最初の Google 検索で次のように表示されます。

http://www.example-code.com/python/pythonrsa.asp

http://www.chilkatsoft.com/dsa-python.asp

于 2010-11-03T12:38:58.437 に答える
0

クライアントとサーバーの間でメッセージをスパイする人は誰でも、新しいメッセージを偽造することができ、クライアントのGUID情報は変更されず、RSA-ENCRYPTED-GUID.

このメッセージ モデルへの切り替えを検討してください: [GUID; ENCRYPTED_CONTENT_CHECKSUM; CONTENT]

Checksum(message.CONTENT) == 
    RSADescrypt(C1.PUBLIC_KEY, message.ENCRYPTED_CONTENT_CHECKSUM)

それでも、メッセージをスパイする人は、以前に送信したメッセージを再送信できます。

于 2010-11-03T12:42:19.160 に答える
0

この方法の問題点は、任意のマシンが GUID と rsa-encrypted-guid を取得し、それらをまったく同じように渡すことができることです。受信側のクライアントだけが推測できる独自のチャレンジ/レスポンス基準を作成していません。必要なのは、完全に一意であり、渡されたパラメーターを見るだけでは取得できないものです。たぶん次のようなもの:

[ClientName; RSA-ENCRYPTED(GUID+Timestamp); MESSAGE]

この方法では、RSA 暗号化は Client2 の公開鍵を使用して行われるため、Client2 の秘密鍵だけがロックを解除できます。ClientName を使用して、Client2 は予想される GUID をデータソースから取得し、返された GUID を暗号化された GUID と照合できます。タイムスタンプをソルトとして使用して、暗号化された文字列が毎回異なる結果になるようにしました。ソルトのランダム化としてタイムスタンプを使用するのは非常に弱いと考えられていますが、それは理解できます。他のより安全な/ランダムなアルゴリズムを実装できます。

于 2010-11-03T12:37:31.707 に答える
0

公開鍵と秘密鍵は、行く方法です。データの暗号化は気にしないと思いますが、データが「承認されている」ことは気にします。

3台のコンピューターがあるとしましょう

Comp1 Comp2 Comp3

また、Comp1 から Comp3 にメッセージを送信するとします。メッセージが傍受されたかどうかは気にしませんが、偽造されていないことは気にします。

Comp1 は、秘密鍵を使用してメッセージにデジタル署名します。

Comp2 は Comp1 から Comp3 へのメッセージをインターセプトしますが、署名を無効にせずにメッセージを変更することはできません。

Comp2 はメッセージを Comp3 に転送します

Comp3 は Comp1 の公開鍵を使用して署名を復号化し、署名のハッシュを使用して内容を検証します。

データを暗号化する場合は、追加の手順を追加する必要があります

Comp1 は、秘密鍵を使用してメッセージにデジタル署名します。

Comp1 は、ランダムな暗号化キー (通常は AES) を生成し、メッセージを暗号化します。

Comp1 はその暗号化キーを取得し、Comp3 の公開キーで暗号化します

Comp2 はメッセージを傍受しますが、Comp3 の秘密鍵がないと読み取ることができません

Comp2 はメッセージを Comp3 に転送します

Comp3 はその秘密鍵を使用して AES キーを復号化します

Comp3 は、AES キーを使用してメッセージ全体を復号化します

Comp3 は、Comp1 の公開鍵を使用して署名を復号化することにより、メッセージを検証します。

署名にはメッセージのハッシュが含まれます。ハッシュとメッセージのハッシュが一致する場合、データはそのままです。

ペイロードに GUID を含めて、ルックアップとして使用し、使用する公開キーを決定できます。

PSメッセージに署名するには、組み込みのメソッドを使用する必要があります。フレームワークにハッシュなどを行わせる

于 2010-11-03T17:19:29.590 に答える