2011-05-06 13 views
1

私はC++でクライアント/サーバーアプリケーションを構築しており、各クライアントにパスワードを提供する必要があります。明らかに私は輸送中にこれを安全にしたいので、私はパスワードを暗号化する方法を探していました。サーバーアプリケーションだけがそれを再度復号化できるようにします。パスワード用のクライアント/サーバー暗号化

私が抱えている問題は、必ずしも機能するものではなく、コードに関連付けるために必要なことを理解していることです。私はMSDNを理解しようとしていますが(私のような気分ですが)まだ勉強しているだけなので、私の実装について明確で正確なガイダンスが必要です。

これは正しいですか?

  1. 私はサーバーとクライアントの両方でCSPにコンテキストを取得します。
  2. 私はサーバー上にキーを生成するか、または何でもロードします。

、その後、私は

サーバーから公開鍵をエクスポートし、それをクライアントに送信し、クライアントがキーをインポートして、パスワードを暗号化し、唯一のサーバーが再びそれを解読できるように、それを返します。 (試してみると失敗します)

OR、私はその後

交換鍵のペアで暗号化されたセッションキー、または交換鍵ペア(単一の公開)をエクスポートできますか?

ああ私は失われている、私は明確に説明することはできません。

それは本当にあなたが1をベースとする認証ソリューションのどのような種類に依存して...私はこれを理解するために

+0

ありがとうございました!まだ少し混乱していますが、この作業をするには非常に決定しています。私はすでに利用可能なものとおそらくもっとシンプルなものを使うことができますが、物事が苦しくなったり困惑したりするときには飛び越えなければなりません。実際に私の問題はこの暗号APIとその使用に関係しているので、私は私の質問にもっと具体的にすべきでした。私は今、私を抱きしめていた元のエラーを過ぎてしまったので、私は実際のプロトタイプから遠くないことを知っています。良いリンクを投稿してください。CryptoAPI、RSA、暗号化。私はいつか私の狂気が報われると確信しています! – LeeC

答えて

1

を助けてください。オプションはさまざまです。

例えば、基礎となるOS認証に依存することができます。パスワードを管理する必要はありません。しかし、これには、アプリケーションが実行されているドメインとのやや緊密な統合が必要です。

もう1つのオプションは、HTTPSと簡単な認証を使用することです。基本的にSSLを使用して通信を暗号化し、ユーザー名とパスワードのペアを送信します。かなりシンプルで、すべてのWebサーバーでサポートされています。インストールされているIISのような既存のWebサーバーに依存したくない場合は、C++コードを簡単に見つけることができます(このような質問に対するStackOverflowの検索)。

+0

こんにちはgigantt.com、はいHTTPSとSSLは私に5yearsウェブデベロッパーがいるので、実際には私にはよく知られています。しかし、メッセージがそこに到着すると、平文ではなく、ユーザー名とパスワードの両方が含まれます。それで私は心配です!どのようなハッシュオプションがありますか?クライアント上でメッセージをハッシュするとD/Bのwhatsと比較できるので、平文のパスワードはどこでも利用できない。 – LeeC

+0

トランスポート層が暗号化されている限り(https)、プレーンテキストパスワードの送信について心配する必要はありません。もちろん、あなたはmd5でそれをハッシュすることができますし、決してあなたのデータベースに平文版を保存するべきではありませんが、基本的にはhttpsのセキュリティに依存しています(たとえハッシュされていても、 ..) - 転送のためにパスワードをハッシュすると、おそらくこの理由のためにたくさんのセキュリティが追加されることはありません。 –

1

データ転送などのために暗号化された通信が必要ない場合は、パスワード確認にChallenge-Responseを使用できます。パスワードはネットワーク経由で転送する必要はなく、第三者がパケットを再送信するだけでは再生攻撃のリスクはありません。欠点としては、中間(MITM)攻撃の可能性があります。

MITMからの保護が必要な場合や、他の通信用に暗号化されたチャネルが必要な場合は、証明書付きのTLSまたは2つの鍵ペアを使用した公開鍵暗号を使用する必要があります。

+0

こんにちはStephanと返信ありがとうございますので、一般的に私はCSPのコンテキストを取得し、サーバーのキーを作成し、クライアントに公開キーを送信するので、アプリケーションが暗号化して返信することができます(またはniaveです - )それはより関与しています。私はほとんどのコードを持っており、サーバー上で暗号化と復号化を行うことはできますが、クライアントに送信する鍵は不明です。私は、セッションキー、交換キー、または単に公開キーをエクスポートするオプションがありますか? – LeeC

+0

私の答えはチャレンジ/レスポンスの部分に焦点を当てましたが、私は今、2番目の部分が多少不明であることを知りました。サーバーの公開鍵はすでにクライアントに格納されている必要があります。そのため、接続中にランダムなセッション鍵をサーバーに送信することができます。私はあなたがクライアント攻撃の秘密鍵を使ってリプレイ攻撃などを防ぐことができることを知っていますが、私はTLSや何かにどのように向かうのかわかりません:/ –

+0

Stephanありがとうございました。何かが私がそこにいると私に伝えてくれるので、自分自身を助けてください!)あなたはそれを見てプロセスを説明できますか?私はcspへのcontxtをServer - (S)とClient(C)の両方で得ることができ、私は公開、私的、交換などのいずれかの鍵をエクスポートすることができます。どのキー(C)を使用していてもクライアントはNTE_BAD_VERエラーをスローします。 - >次のコメントも! – LeeC

1

何もしないでください。

これは非常に重要です。これを自分で実装しないでください。
繰り返しあなたが間違っているものは何もしません。

既に利用可能なものを使用する必要があります。 SSLソケットへの接続を開くだけで、ストリームのコンテンツは自動的に暗号化され、反対側では暗号解除されます。

あなたのアプリケーションは単純にユーザー名/パスワードのタプルを取り、それらが正しいかどうかを確認するだけです。暗号化部分を実装しようとしないでください。

+0

こんにちはMarten、返信いただきありがとうございますが、サーバーに当たったときにパスワードがプレーンテキストに解読されるため、このシナリオではセキュリティの問題は依然として残っているのではないかと心配しています。これはまた、平文のパスワードをDBに格納することを意味するでしょうか?これを防ぐためにエンドポイントの暗号化やハッシングの何らかの形として何を提案しますか?私は大学でRSAをやったことがありますが、私が理解していないこの特定のクライアント/サーバ設定では、アルゴを理解するだけです。ありがとう! – LeeC

+0

pwdをプレーンテキストとしてdbに格納する問題は、トランスポート層の暗号化に関する質問とは関係ありません。確かに、pwdのハッシュとソルトバージョンをdbに格納してください。他の方法で平文パスワードを記録したり保存したりしないでください。しかし、再び、これはhttpsとは関係ありません。 –

+0

クライアント:(Passowrd PlainText) - > SSL - >サーバー(平文) - >ハッシュ(塩分の片方向) - > DB。個人的には、クライアント上でハッシングを実装することはありません。ハッシングのための単一のテクニック(およびハッシュバージョン管理を含むスキームを開発し、永久に古いバージョンをサポートする準備ができていること)に非常に苦労します。 –

関連する問題