1

状況1-サーバーをデータベースに接続する:
パスワードはプレーンテキストで保存するべきではないと常に言われていますが、mysqlデータベースに接続するにはパスワードが必要です、プレーンテキストではそうです...私はこれは、暗号化された形式で保存し、必要に応じてアプリで復号化してから、メモリから消去することです(WindowsのSecureZeroMemoryは、コンパイラが最適化できないと思います)。

状況2-ユーザーがリモートコンピューターからサーバーにログインする:
ユーザーのパスワードに関しては、私の計画では、元のパスワードを実際に保存することはまったくありません。代わりに、ランダムに生成された「ソルト」を保存します。ユーザーごとに、パスワードのプレフィックスを付けてからハッシュします。これは比較的一般的な方法のようです。ただし、現時点ではSSL接続を利用できないため、プレーンテキストのパスワードが傍受される可能性があると思います。これに対する適切な解決策は何ですか。

これを行うための優れたアルゴリズム(C / C ++実装へのリンクがあれば便利です)は何ですか?ネットで見ると何百ものアルゴリズムがありますか?

編集:
SSLを取得した場合、以下は安全ですか(強力なハッシュアルゴリズムが使用されていると仮定)、または別の方法を使用する必要がありますか?

  1. クライアントがユーザー名のソルトを要求する
  2. クライアントはパスワードの前にsaltを付け、ハッシュをサーバーに送信する前にハッシュします
  3. サーバーは、受信したハッシュをそのユーザー名についてサーバー上のハッシュと比較します
4

5 に答える 5

1

SSLを使用していない場合、パスワードが傍受される可能性があるのは正しいことです。

ユーザーのパスワードを復号化しないのが一般的な方法です。そのため、ソルトを使用してハッシュ化して保存し、ユーザーがパスワードを入力するときに、ソルトを追加してハッシュし、保存されているハッシュ化されたパスワードと比較します。これにより、復号化されたバージョンのパスワードを毎回使用することはできなくなります。

ユーザーがパスワードを入力したときにパスワードが安全になるように、接続の保護を実際に検討する必要があります。

編集された質問に回答するための更新:
SSLを使用して通信を保護している場合でも、パスワードのハッシュを含む、任意の数の追加のセキュリティ対策を使用できます。セキュリティを強化するために、保存するパスワードはソルトでハッシュ化して保存する必要があることを覚えておくとよいでしょう。その塩は安全に保管し、アプリケーション以外の場所からアクセスできないようにする必要があります。このように、ユーザーがパスワードを送信するときに、ソルトとハッシュを追加し、そのバージョンを保存されているバージョンと比較します。

于 2009-08-04T12:54:27.913 に答える
1

状況 1 - サーバーをデータベースに接続する

ここには簡単な答えはありません。接続するために、サーバーはパスワード (または対称鍵、秘密鍵など) を必要とします。ディスクまたは何らかの外部手段 (管理者が起動時に入力するなど) から取得する必要があります。すべての機密情報をマスター パスワードで暗号化するなど、何らかの間接化を追加すると、利便性が向上しますが、状況は変わりません。

通常、サーバー上のファイルにパスワードまたはキーを配置しても問題ありません。これを行う場合は、必要なユーザーのみがアクセスできるように、ファイルのアクセス許可を設定してください。これは、システム上のさまざまなプロセスをさまざまなユーザーとして実行し、それぞれに個別の役割/アカウントとパスワードを設定する優れた理由です。

状況 2 - ユーザーがリモート コンピューターからサーバーにログインしている

あなたはここで正しい方向に向かっていると思います。あなたが求めているように聞こえるのは、安全な認証プロトコルです。相互認証を提供し、中間者攻撃が試みられた場合に失敗することで中間者攻撃を防ぐものが必要です。もちろん、たくさんの選択肢があります。

また、認証が「知っていること」(パスワード) に基づいて動作するか、「持っているもの」(公開鍵/秘密鍵) に基づいて動作するかを検討する価値があります。あなたの質問に基づいて、私たちが探しているのはパスワードであると仮定すると、私が気に入っているのは SRP と Kerberos の 2 つです。

SRP については前述しましたが、十分な注目を集めていません。SRP には、サーバーがパスワード、キー、または攻撃者がアクセスするために使用できるものを知る必要がないという利点があります。SRP を使用して正しく構成されたサーバーに侵入し、すべてのデータを盗んだ場合でも、ユーザーになりすますために使用できるものを得る前に、各キーに対して個別に辞書攻撃のようなことを行う必要があります。

また、Kerberos は多くのソフトウェアでサポートされているため (Postgres がサポートしていることは知っていますが、mysql が適切な認証テクノロジをサポートしていないという言及しか見つかりませんでした)、シングル サインオン機能を提供する「チケット」のシステムを備えているため、Kerberos も気に入っています。Kerberos には、最初の認証交換を強化するのに役立つ他のテクノロジが必要であり、SRP はそのために最適ですが、まだそれを行っているかどうかはわかりません。KDC(キーサーバー)をステートフルにすることについての何かだと思います。

Kerberos の弱点は、サーバーが鍵を保管することにもっと注意を払わなければならないことです。パスワードはプレーンテキストで保存されませんが、基本的にパスワードのハッシュ バージョンであるキーが保存されます。また、クライアントは認証時にパスワードまたはキーのいずれかを正確に送信するわけではありませんが (これは結局のところ、本物の認証プロトコルです)、ハッシュ化されたパスワードをキーとして使用するため、アルゴリズムを知っていて知っている人なら誰でもキーも同じことができます。サーバーは「同等のパスワード」を保存すると言います。その結果、すべてのマニュアルは、管理者に kerberos サービスを個別のロックダウンされたボックスに配置して、コンテンツが危険にさらされる可能性を最小限に抑えるように指示しています.

良い点は、一度強力な認証交換に落ち着くと、通常、他の良いことが無料でなくなることです. 最終的には、セッション中に一度だけ使用でき、ネットワーク経由で送信されることはなく、第三者に知られることのない相互の「秘密」を共有することになります。暗号化が必要ですか? 鍵があります。準備万端です。これは、SRP で保護された SSL が RFC 5054 で定義されている方法とまったく同じです。

于 2010-05-26T07:54:28.940 に答える