bcrypt java maven_BCrypt 密码加密

1 介绍

任何应用考虑到安全,绝不能明文的方式保存密码。密码应该通过哈希算法进行加密。有很多标准的算法比 SHA 或者 MD5,结合 salt (盐)是一个不错的选择。Spring Security 提供了 BCryptPasswordEncoder 类,实现 Spring 的 PasswordEncoder 接口使用 BCrypt 强哈希方法来加密密码。

BCrypt 强哈希方法每次加密的结果都不一样。

2 准备工作

2.1 maven 依赖

org.springframework.boot

spring-boot-starter-security

复制代码

2.2 WebSecurityConfig 配置类

我们在添加了 spring security 依赖后,所有的地址都被 spring security 所控制了,我们目前只是需要用到 BCrypt 密码加密的部分,所以我们要添加一个配置类,配置为所有地址都可以匿名访问。

/**

* 安全配置类

*/

@Configuration

@EnableWebSecurity

public class WebSecurityConfig extends WebSecurityConfigurerAdapter{

@Override

public void configure(HttpSecurity http) throws Exception{

http.authorizeRequests()

.antMatchers("/**").permitAll()

.anyRequest().authenticated()

.and().csrf().disable();

}

}

复制代码

说明:

authorizeRequests():所有 security 全注解配置实现的开端,表示开始说明需要的权限。需要的权限分为两个部分:1.拦截的路径;2.访问该路径需要的权限。

antMatchers():表示拦截什么路径。

permitAll():表示任何权限到可以访问,直接放行所有。

anyRequest():任何的请求。

authenticated():认证之后才能访问。

.and().csrf().disable():固定写法,表示使 csrf 拦截失效。

2.3 注入 BCryptPasswordEncoder 类到容器

@SpringBootApplication

public class UserApplication{

public static void main(String[] args){

SpringApplication.run(UserApplication.class, args);

}

@Bean

public IdWorker idWorker(){

return new IdWorker(1, 1);

}

@Bean

public BCryptPasswordEncoder bcryptPasswordEncoder(){

return new BCryptPasswordEncoder();

}

}

复制代码

3 加密

3.1 Service 层加密

调用 BCryptPasswordEncoder 的 public String encode(CharSequence rawPassword) 方法,传参就用封装在 Admin 中的 password 字段。

@Service

public class AdminService{

@Autowired

AdminDao adminDao;

@Autowired

IdWorker idWorker;

@Autowired

BCryptPasswordEncoder bCryptPasswordEncoder;

public void addAdmin(Admin admin){

admin.setId(idWorker.nextId() + "");

admin.setPassword(bCryptPasswordEncoder.encode(admin.getPassword()));

adminDao.save(admin);

}

}

复制代码

3.2 dao 层

public interface AdminDao extends JpaRepository, JpaSpecificationExecutor{

}

复制代码

3.3 controller 层

@RequestMapping(value = "/admin")

@RestController

@CrossOrigin

public class AdminController{

@Autowired

AdminService adminService;

@PostMapping

public Result addAdmin(@RequestBody Admin admin){

adminService.addAdmin(admin);

return new Result(StatusCode.OK, true, "增加管理员成功");

}

}

复制代码

3.4 测试

534df64938cb0e8695e131e214f6eab9.png

4 解密

4.1 AdminDao 增加方法定义

通过登录名到数据库中获取 admin 的全部信息,封装到 Admin 中。

public interface AdminDao extends JpaRepository, JpaSpecificationExecutor{

Admin findByLoginname(String loginname);

}

复制代码

4.2 AdminService 增加方法

主要用到了 public boolean matches(CharSequence rawPassword, String encodedPassword) 方法,第一位填写 “生密码” 即手动输入的密码,第二位填写 “加密之后的密码” 即数据库中保存的密码。

public Admin login(Admin admin){

Admin adminFromSQL = adminDao.findByLoginname(admin.getLoginname());

if (adminFromSQL != null && bCryptPasswordEncoder.matches(admin.getPassword(), adminFromSQL.getPassword())) {

return adminFromSQL;

}

return null;

}

复制代码

4.3 AdminController 增加方法

@PostMapping(value = "/login")

public Result login(@RequestBody Admin admin){

Admin adminLogin = adminService.login(admin);

if (adminLogin == null) {

return new Result(StatusCode.ERROR, false, "登录失败");

}

return new Result(StatusCode.OK, true, "登录成功");

}

复制代码

4.4 测试

ff518a51c64622074e85ae0feaefb85e.png

9b0d41624b85f85a17b9099a24b95888.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值