到目前为止,我的应用程序是使用简单的MD5算法散列用户密码,现在我们在应用程序中引入了Spring Security,并且更喜欢使用BCrypt。我的问题如何将旧密码迁移到新算法。
对于问题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=?");
}
我没有在我的应用程序中使用UserDetailsService,只提供了上面的查询。我已经使用了CustomUsernamePasswordAutheticationFilter和CustomPasswordEncoder,如果这在这个问题上有用的话。
谢谢,
答案 0 :(得分:3)
您应该能够继承BCryptPasswordEncoder
,覆盖matches
方法,首先让BCryptPasswordEncoder
尝试找到匹配项,如果匹配不成功,请尝试MD5
与您现有的代码匹配。这样,拥有BCrypt
哈希密码并提供正确值的每个人都将快速登录(由于内置BCryptPasswordEncoder
逻辑)。拥有旧MD5
哈希密码并提供正确值的所有人也将登录(由于您的自定义代码),但会因首先进行BCrypt
匹配而产生额外的惩罚。其他人都不会登录,但登录失败路径会导致MD5
检查的额外罚款。
不是试图重新散列现有密码,而是建议用户在完全转移到BCrypt
后更改密码,从那时起,新选择的密码将自动使用{{1}进行哈希处理并且你将节省自己与BCrypt
哈希匹配的麻烦。许多公司过去都这样做过,所以对用户来说这可能不是一个令人惊讶的举动。
如果您拥有强大的忘记密码功能,甚至可能根本不匹配MD5
。您只需让用户使用旧的MD5
哈希密码登录失败,并要求他们使用MD5
功能创建一个新功能(无论如何都会使用Forgot Password
进行加密)。< / p>