亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java中BCryptPasswordEncoder密碼的加密與驗證方式

 更新時間:2023年08月25日 11:28:14   作者:DMY小天天  
這篇文章主要介紹了java中BCryptPasswordEncoder密碼的加密與驗證方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

java BCryptPasswordEncoder密碼的加密與驗證

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
public class Test{
    public static void main(String[] args) {
        BCryptPasswordEncoder bcp = new BCryptPasswordEncoder();
        String mm_pub = "123456";
        String mm_encode = bcp.encode(mm_pub);
        //bcp.matches(mm_pub,mm_encode),第一個參數(shù)是前端傳遞過來的明文密碼,如123456,第二個參數(shù)是添加用戶時存儲的密碼
        if(bcp.matches(mm_pub,mm_encode)){
            System.out.println("密碼校驗成功");
        }else{
            System.out.println("密碼錯誤");
        }
    }
}

BCryptPasswordEncoder加密、驗證策略

通過查看源碼,了解PasswordEncoder加密以及驗證密碼(數(shù)據(jù)庫存儲的加密密碼與用戶輸入的密碼比較)的流程、方式。

加密

public String encode(CharSequence rawPassword) {
		String salt;
		if (random != null) {
			salt = BCrypt.gensalt(version.getVersion(), strength, random);//生成鹽
		} else {
			salt = BCrypt.gensalt(version.getVersion(), strength);//生成鹽
		}
		return BCrypt.hashpw(rawPassword.toString(), salt);//根據(jù) 明文密碼 ,鹽(隨機) 然后生成加密密碼
	}

BCryptPasswordEncoder類有三個構造方法,影響了鹽的生成,如果在生成BCryptPasswordEncoder對象的時候沒有指定任何參數(shù)(或只指定了一個參數(shù)),BCrypt會提供默認值,最終都會調用BCrypt.gensalt(strength, random)方法來生成鹽。

接著看BCrypt類的hashpw()方法,在這個方法中根據(jù)salt值和明文密碼來生成密文密碼。

具體的生成細節(jié)就不再展示了,有興趣的可以自己去看。

需要記住的是,它是先 生成鹽值,根據(jù)鹽值以及明文密碼 生成密文。

解密

因為匹配方法里面用到解密

BCryptPasswordEncoder的matches()方法代碼如下:

public boolean matches(CharSequence rawPassword, String encodedPassword) {
		if (encodedPassword == null || encodedPassword.length() == 0) {
			logger.warn("Empty encoded password");
			return false;
		}
		if (!BCRYPT_PATTERN.matcher(encodedPassword).matches()) {
			logger.warn("Encoded password does not look like BCrypt");
			return false;
		}
		return BCrypt.checkpw(rawPassword.toString(), encodedPassword);
	}
  • rawPassword :提交表單的用戶密碼,就是未加密的,例如表單提交為:123456
  • encodedPassword:從數(shù)據(jù)庫 中獲取的 已加密的密碼(例如數(shù)據(jù)庫中加密過的密碼:“$2a$10$3HY7qAX3Hry.6uuipvWjs.liaOjCIxw93SWxYaviQygwVg3VzUqHq”(反正看不懂,這個加密密碼里面有一部分是 鹽)

“$2a$10$3HY7qAX3Hry.6uuipvWjs.liaOjCIxw93SWxYaviQygwVg3VzUqHq” 就是用明文 123456 加密

如果表單密碼和數(shù)據(jù)庫加密密碼匹配,則返回true

如果不匹配,則返回false。

因為上面的matches()方法最后是調用checkpw(),所以我們來看一下

public static boolean checkpw(String rawPassword, String encodedPassword) {
?? ??? ?return equalsNoEarlyReturn(encodedPassword, hashpw(rawPassword, encodedPassword));
}

hashpw()這個上面說過了,就是根據(jù) 明文密碼 鹽 ,然后生成加密密碼

  • encodedPassword: 數(shù)據(jù)庫的密文密碼
  • hashpw(rawPassword, encodedPassword)):把表單的密碼和數(shù)據(jù)庫的密文密碼 加密 成 新的密文密碼

然后再把這個 新的密文密碼 和 數(shù)據(jù)庫的密文密碼 比較,如果相同就返回true。

就是說 數(shù)據(jù)庫的密文密碼 本身不會被解碼

只是用表單的密碼通過某種規(guī)則加密成新的密碼,然后再把新的密碼和數(shù)據(jù)庫的密文密碼做比較。

如果有小伙伴想研究的更深的話,可以繼續(xù)看一下源碼。

下面我給大家看一下我的的例子

只是Controller里面的一個方法,至于service,dao層 自己寫啦,這應該都會

/*
	* 新建、修改用戶
	* */
	@PostMapping
	@ResponseBody
	public String saveUser(User user){
		PasswordEncoder encoder=new BCryptPasswordEncoder();
		if(user.getId()==null){
			//新增用戶,所以把表單的密碼加密一下
			String encodePassword=encoder.encode(user.getPassword());
			user.setPassword(encodePassword);	
		}else{
			//判斷密碼是否做了修改
			User DbUser=userService.getUserById(user.getId());//從數(shù)據(jù)庫查找數(shù)據(jù)
			boolean isMatch=encoder.matches(user.getPassword(),DbUser.getPassword());//第一個參數(shù)是表單的密碼(未加密的),第二個是數(shù)據(jù)庫里面已經(jīng)加密過的密碼
			if(!isMatch){
				//因為要改密碼,所以把表單的密碼加密
				String encodePassword=encoder.encode(user.getPassword());
				user.setPassword(encodePassword);
			}else{
				user.setPassword(DbUser.getPassword());//雖然密碼沒變,但是這個表單user也要保存到數(shù)據(jù)庫,要么把表單密碼加密放進數(shù)據(jù)庫,要么就直接用數(shù)據(jù)庫原本的加密密碼
			}
		}
		userService.saveOrUpdateUser(user);//把這個user保存到數(shù)據(jù)庫
		return "添加或修改用戶成功";
	}

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java可變參數(shù)列表詳解

    Java可變參數(shù)列表詳解

    這篇文章主要介紹了Java可變參數(shù)列表詳解的相關資料,需要的朋友可以參考下
    2017-05-05
  • java自旋鎖和JVM對鎖的優(yōu)化詳解

    java自旋鎖和JVM對鎖的優(yōu)化詳解

    這篇文章主要為大家介紹了java自旋鎖和JVM對鎖的優(yōu)化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • java8使用filter()取出自己所需數(shù)據(jù)

    java8使用filter()取出自己所需數(shù)據(jù)

    這篇文章主要介紹了java8使用filter()取出自己所需數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Java拖曳鼠標實現(xiàn)畫線功能的方法

    Java拖曳鼠標實現(xiàn)畫線功能的方法

    這篇文章主要介紹了Java拖曳鼠標實現(xiàn)畫線功能的方法,需要的朋友可以參考下
    2014-07-07
  • Spring詳細講解循環(huán)依賴是什么

    Spring詳細講解循環(huán)依賴是什么

    這篇文章主要介紹了Java中的Spring循環(huán)依賴詳情,文章基于Java的相關資料展開詳細介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • Java實現(xiàn)學生信息管理系統(tǒng)IO版本

    Java實現(xiàn)學生信息管理系統(tǒng)IO版本

    這篇文章主要為大家詳細介紹了Java實現(xiàn)學生信息管理系統(tǒng)IO版本,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Java 方法簽名詳解及實例代碼

    Java 方法簽名詳解及實例代碼

    這篇文章主要介紹了 Java 方法簽名詳解及實例代碼的相關資料,需要的朋友可以參考下
    2016-10-10
  • SpringBoot?AOP統(tǒng)一處理Web請求日志的示例代碼

    SpringBoot?AOP統(tǒng)一處理Web請求日志的示例代碼

    springboot有很多方法處理日志,例如攔截器,aop切面,service中代碼記錄等,下面這篇文章主要給大家介紹了關于SpringBoot?AOP統(tǒng)一處理Web請求日志的相關資料,需要的朋友可以參考下
    2023-02-02
  • AbstractProcessor擴展MapStruct自動生成實體映射工具類

    AbstractProcessor擴展MapStruct自動生成實體映射工具類

    這篇文章主要為大家介紹了AbstractProcessor擴展MapStruct自動生成實體映射工具類實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Spring中使用Hystrix實現(xiàn)熔斷詳解

    Spring中使用Hystrix實現(xiàn)熔斷詳解

    這篇文章主要介紹了Java中使用Hystrix實現(xiàn)熔斷詳解,對于第一個問題,查看hystrix源碼可以看到,如果有緩存配置是優(yōu)先使用的緩存的,因此如果配置更新,必須要更新緩存,不能使用Hystrix.reset()方法來更新緩存,需要的朋友可以參考下
    2023-12-12

最新評論