Bcrypt密碼加密

Bcrypt密碼加密

1.1 簡介

任何應用考慮到安全,絕不能明文的方式保存密碼。密碼應該通過哈希算法進行加密。有很多標準的算法比如SHA或者MD5,結salt(鹽)是一個不錯的選擇。 Spring Security提供了BCryptPasswordEncoder類,實現Spring的PasswordEncoder接口使用BCrypt強哈希方法來加密密碼。
BCrypt強哈希方法 每次加密的結果都不一樣。

(1)工程中引入依賴

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-security -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    <version>2.2.4.RELEASE</version>
</dependency>

(2)添加配置類
我們在添加了spring security依賴後,所有的地址都被spring security所控制了,我們目前只是需要用到BCrypt密碼加密的部分,所以我們要添加一個配置類,配置爲所有地址都可以匿名訪問。

/**
* 安全配置類
*/
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
	
	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http
			.authorizeRequests()
			.antMatchers("/**").permitAll()
			.anyRequest().authenticated()
			.and().csrf().disable();
	}
}

(3)修改r工程的Application, 配置bean

@Bean
public BCryptPasswordEncoder bcryptPasswordEncoder(){
	return new BCryptPasswordEncoder();
}

1.2 管理員密碼加密

1.2.1 新增管理員密碼加密
@Autowired
BCryptPasswordEncoder encoder;
public void add(Admin admin) {
	admin.setId(idWorker.nextId()+""); //主鍵值
	//密碼加密
	String newpassword = encoder.encode(admin.getPassword());//加密後的密碼
	admin.setPassword(newpassword);
	adminDao.save(admin);
}
1.2.2 管理員登陸密碼校驗

(1)AdminDao增加方法定義

public Admin findByLoginname(String loginname);

(2)AdminService增加方法

/**
* 根據登陸名和密碼查詢
* @param loginname
* @param password
* @return
*/
public Admin findByLoginnameAndPassword(String loginname, String password){
	Admin admin = adminDao.findByLoginname(loginname);
	if( admin!=null && encoder.matches(password,admin.getPassword()))
	{
		return admin;
	}else{
		return null;
	}
}

(3)AdminController增加方法

/**
* 用戶登陸
* @param loginname
* @param password
* @return
*/
@RequestMapping(value="/login",method=RequestMethod.POST)
public Result login(@RequestBody Map<String,String> loginMap){
	Admin admin = adminService.findByLoginnameAndPassword(loginMap.get("loginname"),
	loginMap.get("password"));
	if(admin!=null){
		return new Result(true,StatusCode.OK,"登陸成功");
	}else{
		return new Result(false,StatusCode.LOGINERROR,"用戶名或密碼錯誤");
	}
}

1.3 用戶密碼加密

1.3.1 用戶註冊密碼加密

(4)修改tensquare_user工程的UserService 類,引入BCryptPasswordEncoder

@Autowired
 private BCryptPasswordEncoder encoder;

(5)修改tensquare_user工程的UserService 類的add方法,添加密碼加密的邏輯

/**
* 增加
* @param user
* @param code
*/
public void add(User user,String code) {
	........
	........
	........
	//密碼加密
	String newpassword = encoder.encode(user.getPassword());//加密後的密碼
	user.setPassword(newpassword);
	userDao.save(user);
}

(4)測試運行後,添加數據

{
	"mobile": "13901238899",
	"password": "123123"
}

數據庫中的密碼爲以下形式

$2a$10$a/EYRjdKwQ6zjr0/HJ6RR.rcA1dwv1ys7Uso1xShUaBWlIWTyJl5S
1.3.2 用戶登陸密碼判斷

(1)修改tensquare_user工程的UserDao接口,增加方法定義

/**
* 根據手機號查詢用戶
* @param mobile
* @return
*/
public User findByMobile(String mobile);

(2)修改tensquare_user工程的UserService 類,增加方法

/**
* 根據手機號和密碼查詢用戶
* @param mobile
* @param password
* @return
*/
public User findByMobileAndPassword(String mobile,String password){
	User user = userDao.findByMobile(mobile);
	if(user!=null && encoder.matches(password,user.getPassword())){
		return user;
	}else{
		return null;
	}
}

(4)修改tensquare_user工程的UserController類,增加login方法

/
**
* 用戶登陸
* @param mobile
* @param password
* @return
*/
@RequestMapping(value="/login",method=RequestMethod.POST)
public Result login(String mobile,String password){
	User user = userService.findByMobileAndPassword(mobile,password);
	if(user!=null){
		return new Result(true,StatusCode.OK,"登陸成功");
	}else{
		return new Result(false,StatusCode.LOGINERROR,"用戶名或密碼錯誤");
	}
}

(4)使用剛纔新增加的賬號進行測試,查看返回結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章