使用spring security时如何更改密码哈希算法?

时间:2012-12-07 12:05:52

标签: spring spring-security

我正在研究基于Spring MVC的传统Web应用程序,该应用程序正在使用 - 按当前标准 - 不适当的散列算法。现在我想逐渐将所有哈希迁移到bcrypt。我的高级策略是:

  • 默认情况下使用bcrypt生成新哈希
  • 当用户成功登录并且仍具有旧版哈希时,该应用程序会使用新的bcrypt哈希替换旧哈希。

使用Spring Security实现此策略的最惯用方法是什么?我应该在AccessDecisionManager上使用自定义过滤器还是我??

2 个答案:

答案 0 :(得分:5)

您可能需要自定义AuthenticationProvider,因为密码实际上与用户数据进行了比较,并且您拥有所需的所有信息。

authenticate方法中,您首先要加载用户数据。然后使用BCryptPasswordEncoder和旧版密码检查用户提供的密码。如果两者都没有返回匹配项,则抛出BadCredentialsException

如果用户成功验证(非常重要:-))并且密码是传统格式(传统编码器匹配),您将调用一些额外的代码来更新用户的帐户数据并用bcrypt替换旧的哈希值。 BCryptPasswordEncoder也可用于创建新的哈希值。

如果需要,您可以在进行比较之前预先检测存储的哈希是否已经是bcrypt。 Bcrypt字符串具有完全不同的格式。

另请注意,为了使猜测有效的帐户名称变得更加困难,您应该尝试使方法在提供的用户名存在时和不存在的用户名时都表现相同(就时间而言)。因此,即使您没有所提供用户名的任何用户数据,也请调用编码器。

答案 1 :(得分:0)

我认为最好的方法是在身份验证提供程序中指定密码编码器,如下所示,有关详细信息,请参阅doc

<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>