4

非同期ソケットに基づいてクライアントサーバー通信を作成しています。クライアントはユーザー名とパスワードをサーバーに送信し、サーバーはアカウントが有効かどうかをリプレイします。誰も会話を記録して保持できないように、この手順を保護したい機密データへの不正侵入を達成するためにクライアントに送信する

[質問{簡略化}] サーバーに対してクライアントを安全に認証するにはどうすればよいですか?

[注] SSL は知っていますが、証明書にお金を払う余裕がないので、クライアントとサーバー間の安全な通信を提供する無料の代替手段が必要です。

4

4 に答える 4

13

いつものように、最も安全なパスワードは、サーバーが認識せず、決して送信されないパスワードです。だからあなたができることは次のとおりです:

  • サーバー上に、ユーザー名、ランダム ソルト (「アカウント ソルト」)、およびソルトされたパスワードの安全なハッシュ (「サーバー共有シークレット」) を保存します。
  • ログイン時に、最初のステップでクライアントにユーザー名のみを送信させます (秘密ではありません)。
  • サーバーは、アカウント ソルト (秘密ではない) とランダムに生成されたセッション ソルト (秘密ではない) で応答する必要があります。サーバーがセッションソルトを生成することが重要です。
  • クライアントで、パスワードをアカウント ソルトでソルトしてハッシュし (これを「クライアント共有シークレット」として保持)、セッション ソルトで結果をソルトして再度ハッシュします。これを認証トークンとして送信します (シークレットではありません)
  • サーバーで、DB からソルトハッシュを取得し、セッションソルトでソルトしてハッシュします。これが認証トークンと一致する場合、接続は認証されます。(クライアントはサーバーに対して認証されます)

  • サーバーをクライアントに対してさらに認証する場合は、手順を繰り返します。クライアントはソルトを生成し、サーバーは保存されたシークレットをソルト/ハッシュすることにより、そこからトークンを作成します。

  • 単一のリクエスト (接続だけでなく) を認証する場合は、それらを共有シークレットでソルトしてハッシュし、これをリクエストごとの認証フィールドとして送信します。有効なログイン サーバーの共有秘密鍵とクライアントの共有秘密鍵は同一であるため、両方の側で同じ結果が得られ、認証フィールドが検証されます。

ここに画像の説明を入力

于 2012-09-03T22:51:28.717 に答える
4

私は通常、暗号化を自分で行っていることに気付いた場合、セキュリティ上の問題を発明していると人々に伝えます。:) エッジケースを見逃している可能性は高いです。すでに存在し、厳重に保護されているものに頼ることをお勧めします。

マネージド ソケットを使用している場合は、暗号化を行うストリーム クラスのバージョンがあります (NegotiateStream)。そこから始めて、自分で発明しなくても必要なことができるかどうかを確認することをお勧めします。

于 2012-09-03T22:54:28.383 に答える
0

認証を保護するために、公開鍵と対称鍵の組み合わせを使用できます。

まず、クライアントが認証データを暗号化して送信するための公開鍵を送信します。データが有効な場合は、クライアントに独自の公開鍵を生成させ、互いの公開鍵を介して対称鍵を相互に送信させることができます。

そのようなものがうまくいくはずです。

于 2012-09-03T23:32:07.813 に答える