简介:
加密意义:
2011年12月12日,有人在网络上公开了一个包含600万个CSDN用户资料的数据库,数据全部为明文存储,包括用户名,密码以及注册邮箱。事件发生后CSDN在微博,官方网站等隧道发出声明,解释说此数据库是2009年备份所用,因不明原因泄露,已经向警方报案,后又在官网发出了公开道歉信。在接下来的十多天里,金山,网易,京东,当当,新浪等多家公司被卷入到这次事件中。整个事情中最触目惊心的莫过于CSDN把用户密码明文存储,由于很多用户是多个网站公用一个密码,因此一个网站密码泄露就会照成很大的安全隐患。由于有了这么多前车之鉴,我们现在做系统时,密码都要加密处理。
在前面案例中,凡是涉及密码的地方,我们都采用明文存储,在实际项目中着肯定是不可取的,因为这回带来极高的安全风险。在企业级应用中,密码不仅需要加密,还需要加·盐·,最大程度地保证密码的安全
常见方案:
Hash算法,单向自适应函数
加密方案:
使用固定密码加密方案:
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public UserDetailsService userDetailsService() {
InMemoryUserDetailsManager inMemoryUserDetailsManager = new InMemoryUserDetailsManager();
inMemoryUserDetailsManager.createUser(User.withUsername("wn").password(passwordEncoder().encode("123")).roles("ADMIN").build());
return inMemoryUserDetailsManager;
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService());
}
使用灵活密码加密方案:
@Bean
public UserDetailsService userDetailsService(){
InMemoryUserDetailsManager inMemoryUserDetailsManager=new InMemoryUserDetailsManager();
inMemoryUserDetailsManager.createUser(User.withUsername("wn").password("{bcrypt}123").roles("ADMIN").build());
return inMemoryUserDetailsManager;
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService());
}