web-dev-qa-db-ja.com

ユーザー名とパスワードをクライアントからサーバーに送信する適切な方法

この質問は言語固有ではありません。 ユーザー名とパスワードをウェブサイトのログインフォームからサーバーに適切に送信する方法に興味があります。

私の推測では、パスワードをハッシュし、ユーザー名/パスワードをPOST本文に入れて、HTTPSに送信します。より良い方法は何ですか?

適切な方法として、理想的ではない方法について説明します。

http://www.somesite.com/login?un=myplaintextusername&pw=myplaintextpassword
37
SundayMonday

重要な部分は、フォームデータをPOST本文で送信し(そのため、どこにもキャッシュされず、通常はログファイルに保存されません)、HTTPSを使用することです(適切な場合) SSL/TLS証明書。ネットワークトラフィックを監視してパスワードを盗聴することはできません。その場合、パスワードをハッシュしても、少なくとも転送中は大きなメリットはありません。

では、なぜパスワードのハッシュ化について話題になるのでしょうか。通常、ユーザーのパスワードをプレーンテキスト形式でサーバー側のデータベースに保存することは望ましくありません(そうしないと、侵害されたサーバーの影響が他の場合よりもさらに悪化します)。代わりに、通常はソルト/ハッシュフォームを保存し、フォームデータを介して受け取ったパスワードに同じソルト/ハッシュを適用して、2つを比較できるようにします。

ソルティングの詳細については、 http://en.wikipedia.org/wiki/Salt_(cryptography) (およびそのリンク)を参照してください。

55
Jan Krüger

HTTPSを使用している場合、名前とパスワードをPOST本文で送信できます。これは盗聴者から保護されます(SSLを信頼している場合)。パスワードをハッシュする必要はありません。 、その場合、パスワードハッシュはパスワード自体と同じくらい便利なので、何も購入しません。

より重要な質問は、サーバー側でパスワードをどのように保存するかです。 scrypt のような適切なアルゴリズムを使用する場合にのみ、ハッシュされたパスワードを保存できます。しかし、それは [〜#〜] srp [〜#〜] などの高度なプロトコルほど優れていません。

8
Greg Hewgill

常にHTTPSを使用し、自作のコードは使用しないでください。 SSLはハッシュと暗号化を処理します。これが唯一の安全な方法です。

また、サーバーエンドでパスワードをハッシュし、元のパスワードではなくハッシュを保存していることを確認してください。次に、ハッシュを比較してログインを確認します。これにより、攻撃者が侵害された場合にデータベースから直接プレーンテキストのパスワードを読み取ることを防ぎます。

5
Dave L