在ch05的讲解中我们看到了用户的信息被存储到数据库中,为用户维护与信息共享提供了途径。我们在应用层面做好了安全的同时却忽略了数据的安全,用户的密码以明文的方式存储在数据库中,这成了新的危险点。通过用户密码加密技术就可以解决这个问题。Spring Security也提供了应用层面密码加密技术,配置和应用非常简单。
在Spring Security中密码加密通过PasswordEncoder实现。
springframework.security.authentication.encoding.PasswordEncoder
是Spring Security4.0之前使用的密码加密技术,现在已经不推荐使用了,建议使用能够更好的提供随机salt的新接口
org.springframework.security.crypto.password.PasswordEncoder
目前,Spring Security建议使用BCryptPasswordEncoder,该加密算法可以定制密码长度,密码越长,破解所需时间越多,默认长度为10。该算法较常用的MD5+随机salt高效、易用且更加安全,且不需要在数据库中扩展salt字段。
为了支持密码加密,只需对WebSecurityConfigurerAdapter要进行如下修改
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth, DataSource dataSource) throws Exception {
auth
.jdbcAuthentication()
.passwordEncoder(passwordEncoder())//启用密码加密功能
.dataSource(dataSource);
}
/**
* 密码加密算法
*
* @return
*/
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
此外还需要对数据库中储存的明文进行加密,否则用户登录界面输入的密码加密后与数据库存储的明文密码不一致,无法登录。数据库密码加密可调用passwordEncoder的bean实现
PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String encodedPassword = passwordEncoder.encode("password");
完成以上步骤后,登录用户输入密码,登录成功。通过以上简单配置即可实现应用层面、数据库层面用户密码加密的功能,进一步提高了系统的安全性。
PS:结合ch04、ch05和ch06,调取passwordEncoder对用户修改后的密码加密,并储存到数据库中,就可以实现具有基本功能的、且安全的用户认证管理过程。
代码示例https://github.com/wexgundam/spring.security/tree/master/ch06
网友评论