サーバーとクライアントの間にTLS接続があります。証明書がないため、接続が中間者攻撃の影響を受けやすくなっています。
攻撃者がパスワードハッシュを傍受し、それを使用してアプリケーションで自分を認証するのではないかと心配しています。
パスワードハッシュを送信する最良の方法は何ですか?サーバーノンスまたはクライアントノンスを使用するには?また、どのハッシュアルゴリズムを使用する必要がありますか?
Certificate pinning を確認する必要があります。
これにより、証明書の公開鍵をハードルックアップすることにより、自己署名証明書とクライアントからのサーバー証明書のみを信頼できるようになります。そのため、認証局のチェーンは追跡されず(自己署名証明書が失敗する場所)、代わりに公開鍵がクライアントアプリケーションによって検証され、直接信頼されます。
本質的にMITM攻撃の影響を受けやすいため、アプリケーションレイヤーのハッシュやその他のものは確認しないでください。
できません。
サーバーを認証できず、安全なチャネルを確立できない場合、安全に送信する方法はありません。サーバーを認証できない場合は、サーバーと通信しているのか、攻撃者と通信しているのかがわかりません。したがって、TLSを使用して安全なチャネルを確立したとしても、サーバーと通信していると思っている間に攻撃者と通信している可能性があるため、まったく保護されません。
証明書は必須です。それがなければ、またはサーバーの公開鍵についての知識がなければ、攻撃者がユーザーとサーバーの間の中間者として振る舞う可能性があるため、実際にサーバーと通信しているとは確信できません。
TLSは、キー交換にDiffie-Hellmanを使用します。ウィキペディアのページの security セクションを見ると、次の攻撃が見つかりますが、これはまさにあなたが脆弱なものです。
元の説明では、Diffie-Hellman交換自体は通信相手の認証を提供しないため、中間者攻撃に対して脆弱です。マロリーは、2つの異なる鍵交換を確立することができます。1つはアリスともう1つはボブであり、アリスからボブへと事実上なりすまし、またその逆も可能です。
結論
サーバーを認証するには有効な証明書が必要です。そうしないと、中間者攻撃に対して脆弱になります。これを実現する簡単な方法は、アプリケーションにサーバー証明書を含めることです。これは certificate pinning とも呼ばれます。
自分で作成したルートCA証明書をアプリケーションにバンドルし、信頼されていない証明書をすべて拒否するように構成します。独自のCA証明書のみを使用する場合、これは通常のCAに依存するよりも間違いなく安全です。これは、CAが過去に攻撃者によって侵害されており、政府当局や政治の影響も受けているためです。
独自の認証スキームをロールすることは簡単であり、バンドルされた証明書でTLSを使用するよりも安全性が低いことがほぼ保証されています。
他の人はすでにTLS認証とその問題に関して何ができるかについて述べているので、私は次のことに焦点を当てます。
パスワードハッシュを送信する最良の方法は何ですか?
MITMは、シナリオの脅威の1つです。もう1つの考えられる(非常に一般的な)脅威は、データ侵害です。 mustデータベースが危険にさらされている可能性がある場合を考慮し、mustサーバー側でも必要な予防措置。クライアント側でのパスワードのハッシュは、サーバーをパスワードで信頼せず、サーバーで再度ハッシュするのでない限り、あまりお勧めできません。サーバーは自分のものなので、シナリオには当てはまらないと思います。
クライアントから送信されたパスワードハッシュがデータベースにそのまま保存されている場合、攻撃者はデータベースからハッシュされたパスワードをそのままサーバーに送信して、すべてのユーザーになりすますことができます。この場合、ハッシュされたパスワードは単にシークレットアクセストークンとして機能します。詳細は this を参照してください。
また、どのハッシュアルゴリズムを使用する必要がありますか?
(サーバーにパスワードを保存するための)いくつかの優れたハッシュ関数には、bcrypt、scrypt、およびPBKDF2が含まれます。 Thomas Porninの素晴らしい答え を見て、これらの方が優れている理由を確認してください。基本的に、これらの関数は、適切に使用された場合、データ侵害の場合に攻撃者のタスクをはるかに困難にします。
[〜#〜] srp [〜#〜] ([〜#〜] s [〜#〜]ecureを使用します[〜#〜] r [〜#〜]emote[〜#〜] p [〜#〜] assword)TLSのメカニズム。
クライアントとサーバーは、決して送信されない共有パスワードの知識に基づいて互いに認証します(つまり、パスワードとして使用するもの(この場合はハッシュ)はサーバーによってプレーンテキストで保存される必要があります)。