1

私は今、次のように(クライアント/サーバー通信)セットアップを行っています:

1)クライアントはユーザーにユーザー名とパスを要求します

2)クライアントはこれをポート80(Web経由)を使用してサーバーに送信します

3)サーバーは、これが正しいパスワード(正しいパス/間違ったパス)であるかどうかを通知し、正しい場合は暗号化キーをクライアントに送信します。

4)クライアントは一連のコマンドをサーバーに送信します(すべてのコマンドは、サーバーがクライアントに提供した暗号化キーで始まります)。

5)サーバーはencryptionKeyをチェックしてクライアントを識別し、コマンドに応答します

私の質問は:

これは物事を安全に保つ正しい方法ですか?単一の暗号化キーを前後に送信することが効果があるかどうかはわかりません。クライアントに暗号化キーを生成させ、サーバーにそれを検証させると、さらに役立ちますか?

私がやりたいことは、Facebookがアプリを認証するために行うことのようなものです。たとえば、facebookは、wiresharkやtcpアナライザーなどのプログラムを介して生のパスワードを盗むのを防ぐために何かをしていると想像できます。

それがまったく重要な場合、私のプログラムはc#で記述されており、標準のhttpを使用してデータを送受信します。

ありがとう、

Rohit

4

2 に答える 2

5

あなたがしていることのほとんどを同じに保つために、あなたは単にあなたのステップをに変えることができます

  1. クライアントはユーザーにユーザー名とパスを要求します

  2. クライアントはサーバーへのSSL接続を確立します。

  3. クライアントはSSL接続を介してユーザー名とパスワードを送信します。

  4. サーバーは、これが正しいパスワード(正しいパス/間違ったパス)であるかどうかを示して応答します。

  5. クライアントは一連のコマンドをサーバーに送信します(すべてのコマンドは、パスワードの送信に使用されたのと同じSSL接続を介して送信されます)。

サーバーは、メッセージごとにユーザーのIDを再確認し続ける必要はありません。ただし、1つの継続的な接続を使用している限り、SSLレイヤーがすべての作業を舞台裏で目に見えない形で実行します。


別の注意点として、Facebookはあなたが説明していることとは何もしません。彼らはOAuthを使用します。これは、OAuthがどのように機能するかの基本的な例です(yahooの開発者ページから)

ここに画像の説明を入力してください

したがって、ステップ1はアプリケーションごとに1回作成し、ステップ2〜4はユーザーごとに1回実行してアプリケーションをアカウントに関連付けます。その後、ステップ4で受け取ったトークンの有効期限が切れるまで、ステップ5を実行するだけで済みます(どこでもかまいません)。数時間から数日まで、サイトによって異なります)。トークンの有効期限が切れたら、手順4(または、失敗した場合は手順2〜4)を繰り返すだけで、ユーザーはプログラムを再度使用できます。

ステップ3では、パスワード情報を入力しますが、YahooのWebサイトでパスワードを入力しているため、プログラムがユーザーのユーザー名とパスワードに触れることはありません(これが、OAuthの要点です)。

于 2012-05-16T20:51:25.150 に答える
1

いくつかの一般的な指針:

他の人が指摘したように、可能であればSSLを使用してください。

パスワードをクリアテキストで保存しないでください。代わりに、元のパスワードのハッシュを保存し、比較する前に受信したパスワードを再ハッシュします。SSLを使用できない場合は、送信前にクライアントにパスワードをハッシュしてもらいます(MD5などを使用)。

クライアントがアプリケーション(ブラウザーのページではない)であるがSSLを使用できない場合、クライアントとサーバーは、送信の暗号化に使用できるシークレットを共有できます。もちろん、シークレットは送信しないでください。代わりに、AES暗号化などのキーとして使用してください。

シナリオでは、たとえば、共有シークレット、クライアントIPアドレス、および現在のコマンド(またはそのサブセット)で構成される文字列のハッシュを使用し、コマンドと一緒にハッシュを送信して、自分自身を継続的に認証することができます。サーバー。

ただし、可能であればSSLを使用してください。

于 2012-05-16T23:45:54.580 に答える