Spring Security の戦闘 (8) - HTTP 認証

1.HTTPベーシック認証

        HTTP 基本認証は、Web アプリケーションの認証方法です。これにより、Web サーバーがユーザーの身元を確認するためにユーザー名とパスワードを要求できるようになります。

        基本認証は、HTTP リクエスト ヘッダーに Authorization フィールドを含めることによって実装されます。このフィールドには、ユーザーの身元を証明するためのユーザー名とパスワードが含まれます。たとえば、「認証」フィールドは次のようになります。

権限: 基本 QWxhZGRpbjpvcGVuIHNlc2FtZQ==

        このうち「Basic」はBasic認証の使用を示し、次の文字列はエンコードされたユーザー名とパスワードです。この文字列は実際には、コロンで区切られたユーザー名とパスワードで構成される Base64 でエンコードされた文字列です。

HTTP 基本認証は単純な認証メカニズムであり、通常は次の 4 つの手順が含まれます。

  1. クライアントはサーバーにリクエストを送信します。クライアントは、認証を必要とする Web ページなど、認証を必要とするリソースにリクエストを送信します。

  2. サーバーが 401 Unauthorized 応答を返す: クライアントが認証情報を提供していないため、サーバーは認証が必要であることを示す 401 Unauthorized 応答を返します。

  3. クライアントが認証情報を提供する: 401 Unauthorized 応答を受信した後、クライアントはユーザー名やパスワードなどの認証情報を提供するようユーザーに求めます。ユーザーが認証情報を提供すると、クライアントはこの情報をエンコードし、Authorization リクエスト ヘッダーでサーバーに送信します。

  4. サーバーが認証してリソースを返す: サーバーは、認証情報を含むリクエストを受信すると、それをデコードして検証します。認証が成功すると、サーバーは要求されたリソースを返します。そうでない場合は、エラー応答を返します。

2. HTTPダイジェスト認証

        HTTP ダイジェスト認証は、HTTP 基本認証を改良した Web アプリケーション用の認証方法です。HTTP 基本認証と比較して、HTTP ダイジェスト認証は、ハッシュ関数を使用してパスワードを暗号化し、リプレイ攻撃に対するいくつかの保護メカニズムを提供するため、より強力なセキュリティを提供します。

HTTP ダイジェスト認証の基本的な流れは次のとおりです。

  1. クライアントはサーバーにリクエストを送信します。クライアントは、認証を必要とする Web ページなど、認証を必要とするリソースにリクエストを送信します。

  2. サーバーは 401 Unauthorized 応答を返します。クライアントが認証情報を提供していないため、サーバーは nonce (nonce) や保護品質 (qop) などの概要情報を含む 401 Unauthorized 応答を返します。

  3. クライアントは応答を計算します: クライアントは、ユーザーから提供されたパスワードとサーバーから返された情報を使用して応答を計算します。計算プロセスには通常、次の手順が含まれます。

  • a. 応答ハッシュ値を計算します: クライアントはハッシュ関数 (通常は MD5) を使用して、ユーザー名、パスワード、乱数、リクエスト メソッド、リクエスト URI などの情報を含む文字列に対してハッシュ計算を実行し、結果を 10 にエンコードします。 16 進形式。
  • b. 認証ハッシュ値を計算します: クライアントはハッシュ関数を使用していくつかの概要情報と応答ハッシュ値を計算し、結果を 16 進形式にエンコードします。

        4. クライアントは、認証情報を含むリクエストを送信します。クライアントは、計算された応答と、ユーザー名、乱数、QOP 値 (存在する場合) などのその他の情報を、Authorization リクエスト ヘッダーのパラメーターとしてサーバーに送信します。

        5. サーバーは ID を検証し、リソースを返します。サーバーは、認証情報を含むリクエストを受信した後、それをデコードして検証します。認証が成功すると、サーバーは要求されたリソースを返します。そうでない場合は、エラー応答を返します。

        HTTP ダイジェスト認証はより強力なセキュリティを提供しますが、応答を計算する複雑なプロセスによりパフォーマンスにある程度の影響を受ける可能性があることに注意してください。さらに、HTTP ダイジェスト認証はリプレイ攻撃を防ぐための特定の保護メカニズムを提供しますが、そのセキュリティにはまだ疑問の余地があります。

3. Spring Security の HTTP ダイジェスト認証の統合サポート

        サーバーにとって最も重要なフィールドは nonce であり、クライアントにとって最も重要なフィールドは応答です。

        nonce はサーバーによって生成されるランダムな文字列で、有効期限と秘密キーが含まれます。Spring Security では、その生成アルゴリズムは次のとおりです。

public String generateNonce() {
    byte[] bNonce = new byte[16];
    new SecureRandom().nextBytes(bNonce);
    String sNonce = new String(Base64.getEncoder().encode(bNonce));
    String createdDate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(new Date());
    return String.format("%s%s", sNonce, createdDate);
}

このアルゴリズムは、まず長さ 16 のランダムなバイト配列 bNonce を生成し、次にそれを Base64 エンコードを使用して文字列 sNonce に変換します。次に、アルゴリズムは現在の日付と時刻を使用して、ISO8601 形式 (yyyy-MM-dd'T'HH:mm:ss.SSS'Z') の文字列 createdDate を生成します。最後に、アルゴリズムは sNonce と createdDate を結合し、nonce 値として文字列を返します。この文字列には、一意性を保証するための乱数と作成時刻の情報が含まれており、将来的に有効期限が切れているかどうかを確認するために使用できます。

        検証の一般的なプロセスは、クライアントがまず合意されたアルゴリズムに従って応答を計算して送信し、それを受信した後、サーバーが同じ方法で応答を計算します。2 つの応答が同じであれば、ダイジェストが正しいことが証明されます。次に、base64 を使用して元の nonce をデコードし、有効期限を取得してダイジェストがまだ有効かどうかを確認します。

おすすめ

転載: blog.csdn.net/weixin_49561506/article/details/130358770