6

私は、現在の標準では不適切なハッシュアルゴリズムを使用している従来のSpringMVCベースのWebアプリケーションに取り組んでいます。今、私はすべてのハッシュを徐々にbcryptに移行したいと思います。私の高レベルの戦略は次のとおりです。

  • 新しいハッシュはデフォルトでbcryptで生成されます
  • ユーザーが正常にログインし、レガシーハッシュが残っている場合、アプリは古いハッシュを新しいbcryptハッシュに置き換えます。

Spring Securityでこの戦略を実装する最も慣用的な方法は何ですか?カスタムフィルターを使用する必要がありますか、AccessDecisionManagerで使用する必要がありますか?

4

2 に答える 2

5

AuthenticationProviderパスワードが実際にユーザーデータと比較され、必要なすべての情報が利用できるため、おそらくカスタマイズする必要があります。

このauthenticate方法では、最初にユーザーデータをロードします。次に、aBCryptPasswordEncoderと従来のパスワードの両方でユーザー提供のパスワードを確認します。どちらも一致を返さない場合は、をスローしBadCredentialsExceptionます。

ユーザーが正常に認証され(非常に重要:-))、パスワードがレガシー形式(レガシーエンコーダーが一致)の場合、追加のコードを呼び出してユーザーのアカウントデータを更新し、レガシーハッシュをbcryptのものに置き換えます。は、BCryptPasswordEncoder新しいハッシュを作成するためにも使用できます。

必要に応じて、比較を行う前に、保存されているハッシュがすでにbcryptされているかどうかを事前に検出できます。Bcrypt文字列の形式はまったく異なります。

また、有効なアカウント名を推測しにくくするために、指定されたユーザー名が存在する場合と存在しない場合の両方で(時間がかかるという点で)メソッドが同じように動作するようにする必要があることにも注意してください。したがって、指定されたユーザー名のユーザーデータがない場合でも、エンコーダーを呼び出します。

于 2012-12-07T23:00:44.357 に答える
0

これを行うための最良の方法は、以下のような認証プロバイダーにパスワードエンコーダーを指定することだと思います。詳細については、ドキュメントを参照してください。

<authentication-manager>
    <authentication-provider user-service-ref="userService">
        <password-encoder ref="passwordEncoder">
            <salt-source ref="saltSource" />
        </password-encoder>
    </authentication-provider>
</authentication-manager>


<beans:bean     class="org.springframework.security.authentication.encoding.Md5PasswordEncoder"
    id="passwordEncoder" />

<beans:bean     class="org.springframework.security.authentication.dao.ReflectionSaltSource"
    id="saltSource">
    <beans:property name="userPropertyToUse" value="userName" />
</beans:bean>
于 2012-12-07T12:15:07.637 に答える