使用Spring Security从MD5切换到BCrypt

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

  1. 我可以为Spring Security提供多个密码编码器,以便可以依次使用它们吗?
  2. 成功登录后如何更改密码,因为密码是使用SHA1算法传输的?

对于问题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。

谢谢,

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

最好不要试图重新哈希现有密码,建议用户在完全转移到BCrypt更改密码可能会更好,因为新选择的密码将自动使用BCrypt哈希BCrypt ,您将省去匹配的麻烦。一个MD5哈希。 许多公司过去都这样做过,所以这对用户来说可能不是一个令人惊讶的举动。

如果您具有强大的忘记密码function,甚至可能根本不匹配MD5 。 您只需让用户使用旧的MD5哈希密码登录失败,并要求他们使用Forgot Passwordfunction创建一个新Forgot Password (无论如何都将使用BCrypt加密)。