0

私は典型的なウェブサイト環境でパスワードログインシステムを実装する方法の良い説明を探していました。私はいくつかの素晴らしいウィキペディアの記事やSOQ&Aやブログなどを読みましたが、ハッシュを作成してその一部を送信し、その一部を保存し、サーバー側のコードが何をするかというプロセス全体ではなく、常に純粋にハッシュを生成することに焦点を当てているようですSOにすでに良い答えがある場合は、再投稿をお詫びします。リンクしてください。

私の現在の理解は次のとおりです。

1)新しいユーザーがあなたのウェブサイトに新しいアカウントを作成します。彼らは「パスワード」を入力し、クライアント側のコードは長いランダムな文字列「salt」を生成して最後に追加し、たとえばハッシュ-> BCrypt(password + salt)を生成します。次に、クライアントコードは、完全なハッシュとハッシュされていないソルトをサーバーに送信します。

2)サーバーは、完全なハッシュとハッシュされていないソルトをDBのユーザーエントリに保存します。

3)ユーザーのログイン中にパスワードを入力し、パスワードを再度ソルトでハッシュします。

質問1)クライアント側のコードはどのようにして各ユーザーに対して同じ「ランダムな」ソルト値を生成しますか?

質問2)この時点で、クライアント側のコードはソルトなしで完全なハッシュを送信するだけですか?

質問3)サーバー側は、完全なハッシュを受信すると、それをどのように処理しますか?(送信されたフルハッシュを保存されたフルハッシュと比較するだけですか?その場合、攻撃者はデータベースに侵入して保存されたフルハッシュ値を取得するときに、それらを直接使用してサーバーに送信してログインすることはできませんか?これはログインプロセスには、基本的にサーバーがクライアントから送信された完全なハッシュをデータベースに格納されている完全なハッシュと比較することが含まれるという私の仮定に基づいています。

質問4)パスワードは常に安全な接続を介して送信する必要がありますか?または、それらをソルトしてハッシュすると、誰でも見ることができますか?

4

2 に答える 2

3

ハッシュの目的を混乱させています。有線伝送のパスワードを保護することを目的としたものではありません。クライアントはハッシュを生成しません。ハッシュの目的は、データベースを侵害する攻撃者が、事前に生成されたハッシュルックアップテーブルを使用してユーザーのパスワードをすばやく判断できないようにすることです。

簡単な例を次に示します。@jhoylaが以下のコメントで指摘しているように、工業用グレードの生産スキームはさらに複雑です。

アカウントを作成するには:

  1. クライアントはサーバーとの安全な(暗号化された、SSLなどの)接続を確立し、ユーザー名とパスワードを通常はプレーンテキストで送信します(暗号化されているため問題ありません)。

  2. サーバーはランダムなソルトを生成し、それをパスワードに追加して結果をハッシュし、ハッシュとハッシュされていないソルト値を保存します。

ログインします:

  1. クライアントはサーバーとの安全な(暗号化された、SSLなどの)接続を確立し、ユーザー名とパスワードを通常はプレーンテキストで送信します(暗号化されているため問題ありません)。

  2. サーバーはストレージからソルトを取得し、それをパスワードに追加してハッシュし、その結果をストレージ内のハッシュされたパスワードと比較します。それらが一致する場合、ユーザーはログインしています。

これを行う理由を確認するために、私がWebサイトのデータベースサーバーを攻撃し、データベースをダウンロードしたと想像してください。これで、ユーザー名、おそらく電子メールアドレス、およびパスワードハッシュのリストができました。パスワードがソルトされていない場合、ハッシュの多くが同じになる可能性が非常に高くなります(多くの人が同じ弱いパスワードを使用するため)。私は、それらのユーザーの1人が(たとえば)自分の電子メールアカウントに同じ弱いパスワードを持っている可能性が非常に高いことを知っています。そこで、私は仕事に行き、辞書全体と他の多くの可能性のあるパスワードをハッシュして、これらの人気のあるものの1つに一致するハッシュを探します。ヒットした場合は、たくさんのパスワードを破ったところです。もし私が頭が良ければ、このリストを事前に作成しておけば、すぐに実行できます。

ここで、パスワードがソルトされていると想像してください。これで、2人が同じパスワードを使用した場合でも、それぞれに対して異なるソルトが生成され、結果のハッシュは異なります。どのパスワードが弱い、一般的なパスワードで、どのパスワードが強いパスワードであるかを知る方法がありません。考えられる各パスワードにソルトを追加することで辞書攻撃を試すことができますが、パスワードを解読することの難しさ(時間の観点から)は今や指数関数的に上昇しています。

于 2012-08-06T14:48:37.827 に答える
2

自分で実装することは絶対にしないでください。学習のためだけに必要な場合は、@Chrisが回答しました。しかし、動作するソフトウェアが必要な場合は、それを行わないでください。すべての言語にはセキュリティライブラリがあり、すべてのデータストア(ldap、データベース)にはパスワード保存メカニズムがすでに実装されています。それを使用してください、あなたはおそらくいくつかの詳細を見逃すでしょうので、再び車輪を発明しないでください

于 2012-08-06T19:38:12.570 に答える