ダイジェスト認証

このセクションでは、Spring Security が DigestAuthenticationFilter で提供されるダイジェスト認証 [IETF] (英語) のサポートを提供する方法について詳しく説明します。

ダイジェスト認証は安全ではないと考えられているため、最新のアプリケーションでは使用しないでください。最も明らかな問題は、パスワードをプレーンテキスト、暗号化形式、MD5 形式で保存する必要があることです。これらの保存形式はすべて安全ではないと考えられています。代わりに、ダイジェスト認証ではサポートされていない一方向の適応型パスワードハッシュ (bCrypt、PBKDF2、SCrypt など) を使用して資格情報を保存する必要があります。

ダイジェスト認証は、基本認証の弱点の多くを解決しようとします。具体的には、クレデンシャルがクリアテキストでネットワークを介して送信されないようにすることです。多くのブラウザーはダイジェスト認証をサポートしています [Mozilla]

HTTP ダイジェスト認証を管理する標準は RFC 2617 [IETF] (英語) によって定義され、RFC 2069 [IETF] (英語) によって規定されたダイジェスト認証標準の以前のバージョンを更新します。ほとんどのユーザーエージェントは RFC2617 を実装しています。Spring Security のダイジェスト認証サポートは、RFC 2617 で規定されている「認証」保護品質(qop)と互換性があり、RFC 2069 との下位互換性も提供します。ダイジェスト認証は、必要に応じてより魅力的なオプションと見なされていました。暗号化されていない HTTP(TLS または HTTPS なし)を使用し、認証プロセスのセキュリティを最大化します。ただし、誰もが HTTPS を使用する必要があります。

ダイジェスト認証の中心は「ノンス」です。これは、サーバーが生成する値です。Spring Security のノンスは次の形式を採用しています。

ダイジェスト構文
base64(expirationTime + ":" + md5Hex(expirationTime + ":" + key))
expirationTime:   The date and time when the nonce expires, expressed in milliseconds
key:              A private key to prevent modification of the nonce token

NoOpPasswordEncoder を使用して安全でないプレーンテキストパスワード保存構成していることを確認する必要があります。(Javadoc の NoOpPasswordEncoder (Javadoc) クラスを参照してください)次に、Java 構成を使用してダイジェスト認証を構成する例を示します。

ダイジェスト認証
  • Java

  • XML

@Autowired
UserDetailsService userDetailsService;

DigestAuthenticationEntryPoint authenticationEntryPoint() {
	DigestAuthenticationEntryPoint result = new DigestAuthenticationEntryPoint();
	result.setRealmName("My App Realm");
	result.setKey("3028472b-da34-4501-bfd8-a355c42bdf92");
	return result;
}

DigestAuthenticationFilter digestAuthenticationFilter() {
	DigestAuthenticationFilter result = new DigestAuthenticationFilter();
	result.setUserDetailsService(userDetailsService);
	result.setAuthenticationEntryPoint(authenticationEntryPoint());
	return result;
}

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
	http
		// ...
		.exceptionHandling(e -> e.authenticationEntryPoint(authenticationEntryPoint()))
		.addFilter(digestAuthenticationFilter());
	return http.build();
}
<b:bean id="digestFilter"
        class="org.springframework.security.web.authentication.www.DigestAuthenticationFilter"
    p:userDetailsService-ref="jdbcDaoImpl"
    p:authenticationEntryPoint-ref="digestEntryPoint"
/>

<b:bean id="digestEntryPoint"
        class="org.springframework.security.web.authentication.www.DigestAuthenticationEntryPoint"
    p:realmName="My App Realm"
	p:key="3028472b-da34-4501-bfd8-a355c42bdf92"
/>

<http>
	<!-- ... -->
	<custom-filter ref="userFilter" position="DIGEST_AUTH_FILTER"/>
</http>