私は典型的なウェブサイト環境でパスワードログインシステムを実装する方法の良い説明を探していました。私はいくつかの素晴らしいウィキペディアの記事やSOQ&Aやブログなどを読みましたが、ハッシュを作成してその一部を送信し、その一部を保存し、サーバー側のコードが何をするかというプロセス全体ではなく、常に純粋にハッシュを生成することに焦点を当てているようですSOにすでに良い答えがある場合は、再投稿をお詫びします。リンクしてください。
私の現在の理解は次のとおりです。
1)新しいユーザーがあなたのウェブサイトに新しいアカウントを作成します。彼らは「パスワード」を入力し、クライアント側のコードは長いランダムな文字列「salt」を生成して最後に追加し、たとえばハッシュ-> BCrypt(password + salt)を生成します。次に、クライアントコードは、完全なハッシュとハッシュされていないソルトをサーバーに送信します。
2)サーバーは、完全なハッシュとハッシュされていないソルトをDBのユーザーエントリに保存します。
3)ユーザーのログイン中にパスワードを入力し、パスワードを再度ソルトでハッシュします。
質問1)クライアント側のコードはどのようにして各ユーザーに対して同じ「ランダムな」ソルト値を生成しますか?
質問2)この時点で、クライアント側のコードはソルトなしで完全なハッシュを送信するだけですか?
質問3)サーバー側は、完全なハッシュを受信すると、それをどのように処理しますか?(送信されたフルハッシュを保存されたフルハッシュと比較するだけですか?その場合、攻撃者はデータベースに侵入して保存されたフルハッシュ値を取得するときに、それらを直接使用してサーバーに送信してログインすることはできませんか?これはログインプロセスには、基本的にサーバーがクライアントから送信された完全なハッシュをデータベースに格納されている完全なハッシュと比較することが含まれるという私の仮定に基づいています。
質問4)パスワードは常に安全な接続を介して送信する必要がありますか?または、それらをソルトしてハッシュすると、誰でも見ることができますか?