使用Spring Security从MD5切换到BCrypt

时间:2015-07-08 07:00:58

标签: java spring spring-security bcrypt

到目前为止,我的应用程序是使用简单的MD5算法散列用户密码,现在我们在应用程序中引入了Spring Security,并且更喜欢使用BCrypt。我的问题如何将旧密码迁移到新算法。

  1. 我可以为Spring Security提供多个密码编码器吗? 它们可以依次使用吗?
  2. 成功登录后如何更改密码,因为密码是使用SHA1算法传输的?
  3. 对于问题1,我相信使用CustomAuthenticationProvider可能会有效,但我对如何在我们的系统中使用它感到困惑。下面是我在SecurityConfig类中的configureGlobal函数

    @Autowired
            public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
                auth.jdbcAuthentication()
                        .dataSource(dataSource)
                        .passwordEncoder(passwordEncoder)
                        .usersByUsernameQuery("SELECT uname AS username, upwd AS password, true AS enabled FROM user_table WHERE uname!='' AND uname IS NOT NULL AND uname=?")
                        .authoritiesByUsernameQuery("SELECT uname AS username, 'Default' AS role FROM user_table WHERE uname!='' AND uname IS NOT NULL AND uname=?");
            }
    

    我没有在我的应用程序中使用UserDetailsS​​ervice,只提供了上面的查询。我已经使用了CustomUsernamePasswordAutheticationFilter和CustomPasswordEncoder,如果这在这个问题上有用的话。

    谢谢,

1 个答案:

答案 0 :(得分:3)

您应该能够继承BCryptPasswordEncoder,覆盖matches方法,首先让BCryptPasswordEncoder尝试找到匹配项,如果匹配不成功,请尝试MD5与您现有的代码匹配。这样,拥有BCrypt哈希密码并提供正确值的每个人都将快速登录(由于内置BCryptPasswordEncoder逻辑)。拥有旧MD5哈希密码并提供正确值的所有人也将登录(由于您的自定义代码),但会因首先进行BCrypt匹配而产生额外的惩罚。其他人都不会登录,但登录失败路径会导致MD5检查的额外罚款。

不是试图重新散列现有密码,而是建议用户在完全转移到BCrypt后更改密码,从那时起,新选择的密码将自动使用{{1}进行哈希处理并且你将节省自己与BCrypt哈希匹配的麻烦。许多公司过去都这样做过,所以对用户来说这可能不是一个令人惊讶的举动。

如果您拥有强大的忘记密码功能,甚至可能根本不匹配MD5。您只需让用户使用旧的MD5哈希密码登录失败,并要求他们使用MD5功能创建一个新功能(无论如何都会使用Forgot Password进行加密)。< / p>