1

安全なログインを必要とする C# .NET アプリケーションを作成しています。データベースにハッシュとソルトを使用してパスワードを安全に保存するために必要な機能は既にありますが、現在はテスト段階から移行しています。開発前 (ログインは優先されませんでした) は、自分のデータベースに直接接続するだけでした。データベースの資格情報を露骨にコードに保存するため、これは本番アプリケーションにとって安全ではないことは承知しています。代わりに、ユーザー名をリッスンし、データベースからソルトを送り返し、クライアントが入力されたパスワードをハッシュし (ソルトは一時的にローカルに保存されます)、それをサーバーに送り返す単純な非同期 TCP ソケット サーバーを作成することにしました。次に、サーバーはそれらが一致するかどうかを確認します。ユーザーがチェックアウトした場合、true/false を返します。

私はいくつかの調査を行い、TCP 接続の暗号化を検討しましたが、パスワードは既にハッシュされているため、これは本当に必要ですか? それとも、物事全体を行うためのより良い方法はありますか? クライアント/サーバー アーキテクチャがどのように機能するかについての提案を歓迎します。Login は、アプリケーション全体でそれほど重要な役割を果たしているわけではありません

4

3 に答える 3

3

次に、クライアントは入力されたパスワードをハッシュし (salt は一時的にローカルに保存されます)、それをサーバーに送り返します。サーバーはそれらが一致するかどうかをチェックします。ユーザーがチェックアウトした場合、true/false を返します。

私はいくつかの調査を行い、TCP 接続の暗号化を検討しましたが、パスワードは既にハッシュされているため、これは本当に必要ですか?

何を「パスワード」と呼ぶかは問題ではありません。重要なのは、サーバーが有効な資格情報として受け入れるものだけです。パスワードを入力し、サーバーがそれをそこでハッシュする場合 (@Christian Stewart がコメントで提案したように)、パスワードは資格情報です。自分でパスワードをソルトしてハッシュし、結果をサーバーに送信すると、この結果が資格情報になります。それを傍受することは、元のパスワード + ソルトを傍受することと同じです。

したがって、はい、接続を介して資格情報を送信する前に、接続も暗号化する必要があります。SslStreamClassは、それを行う最も簡単な方法のようです (サーバーとクライアントの両方について、下部にあるコード例を確認してください)。サーバー認証と、オプションでクライアント認証の両方をサポートします (どのマシンも制限したい場合)ログインサーバーにアクセスできます)。

于 2013-03-08T22:59:21.260 に答える
2

1) 機密データを送信する場合、それを保護する最も簡単な方法は SSL を使用することです。これが内部プロジェクトである場合は、独自の証明書を生成できます。また、これが潜在的な問題であるかどうかについて、IT スタッフに相談してください。これが適切に構成された有線イントラネットの状況で展開される場合、ユーザーは互いのトラフィックを見ることができません。

2) ソルトとハッシュの使用が台無しになり、意図した問題が解決されなくなりました。ハッシングとソルティングは、データベースのコンテンツを攻撃者にとって役に立たなくすることを目的としています。ここではそうではありません。データベースに格納されているものは、サーバーが認証トークンとして受け入れたものだからです。サーバーがネットワーク経由で受け入れる値がユーザー ストアに表示される値に不可逆的に (ハッシュ) かつ一意に (ソルト) 変換されるように、ハッシュはサーバー上で実行する必要があります。攻撃者がユーザーのパスワード (つまり、クライアントに入力したもの) を取得するためにそれを逆にすることはできません。これは良いことですが、攻撃者がデータベースの値を知っている場合、パスワードは必要ありません。

3) アタッカーハットをかぶる。認証交換が行われているのを見たら、秘密を知らずにログインできますか? はい、クライアントが最後に送信したものを送信するだけです。したがって、このチャネルは暗号化する必要があります。

4) 回避できる場合は、独自の暗号を作成しないでください。回避できる場合は、ユーザーを管理することさえしないでください。人々は、使用するすべてのアプリケーションでユーザーとグループを管理したいとは考えていません。私は、以前にこの間違いを犯したことがある人として、これを言います。LDAP やドメイン認証などを使用できますか?

于 2013-03-09T00:14:13.897 に答える
1

World of Warcraft で使用される無料のSRPなどのプロトコルを使用して、パスワードを送信せずにサーバーでユーザーを認証する方法があります。

SRP は一連のチャレンジを実行して、各当事者がパスワードについて知っていることに基づいてユーザーを認証しますが、パスワードに関する機密情報がネットワークに漏洩することはありません。

WoW を参照として引き続き使用すると、 TrinityCoreなどのオープン ソース エミュレーターがあり、動作中の SRP の確かな例が得られます。

于 2013-03-08T23:07:29.607 に答える