BCryptPasswordEncoder加密與MD5加密的區(qū)別及說明
MD5加密說明
MD5(Message Digest Algorithm 5)中文名為消息摘要算法第五版,是計算機(jī)安全領(lǐng)域廣泛使用的一種散列函數(shù),用以提供消息的完整性保護(hù)。
MD5作為一種常用的摘要算法(或指紋算法),其具有以下幾個重要的特點(diǎn)(個人觀點(diǎn)):
輸入任意長度信息,輸出長度固定:
- MD5 可輸入任意長度的信息,其輸出均為128位(bit)固定長度的二進(jìn)制數(shù)據(jù)。
運(yùn)算速度快:
- MD5的運(yùn)算均為32位 與、或、非、位移等位運(yùn)算,因此其運(yùn)算速率快,幾乎不消耗CPU時間。
不可逆:
- 根據(jù)MD5的的散列結(jié)果,無法計算出原始數(shù)據(jù)(查字典除外)。
碰撞性:
- 原始數(shù)據(jù)與其MD5散列結(jié)果并非一一對應(yīng),存在多個原始數(shù)據(jù)的MD5結(jié)果相同的可能性。
不安全:
- 2011年,RFC 6151 禁止MD5用作密鑰散列消息認(rèn)證碼。
- MD5計算結(jié)果一般為長度為32的字符串,偶爾也會遇到長度為16的字符串,MD5散列結(jié)果是128位(bit)固定長度的二進(jìn)制數(shù)據(jù),也就是128個0/1的二進(jìn)數(shù)據(jù)。
2011年后MD5加密算法可以被反推出來明文,被破解,已經(jīng)不推薦使用
案例使用
1.字符串
//加密為字符串返回
DigestUtils.md5DigestAsHex("123456".getBytes());
//結(jié)果為:e10adc3949ba59abbe56e057f20f883e2.byte[]字節(jié)返回
//加密字節(jié)返回
DigestUtils.md5Digest("123456".getBytes());
//結(jié)果為:[B@494768423.在字符串后追加加密字符返回StringBuilder
StringBuilder stringBuilder1 = DigestUtils.appendMd5DigestAsHex(bytes,new StringBuilder("123456"));
//結(jié)果:1234564280d89a5a03f812751f504cc10ee8a5解密的話,在java中還沒有提供方法,但是有些網(wǎng)站是可以對MD5進(jìn)行解密的
4. 如果對字符換加密過的字符串再次進(jìn)行加密,則會出現(xiàn)一樣的加密結(jié)果。
案例:

BCryptPasswordEncoder說明
BCrypt 是一種密碼散列函數(shù),即單向函數(shù)。
- 您無法解密 BCrypt 哈希,就像您無法從雞肉麥塊返回原始雞肉一樣。
- 您只能驗(yàn)證兩個 BCrypt 哈希值是否相同,從而驗(yàn)證提供的密碼是否與原始密碼匹配。
一個典型的解決方案是向用戶發(fā)送一次性密碼重置鏈接,使用秘密問題或其他一些確認(rèn)用戶身份的信息讓他們設(shè)置新密碼。
且每次加密過的值都不一樣
案例使用
1.多次執(zhí)行,結(jié)果不一樣
public static void main(String[] args) {
String str = "123456";
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
String encode = bCryptPasswordEncoder.encode(str);
System.out.println(encode);
String encode1 = bCryptPasswordEncoder.encode(str);
System.out.println(encode1);
}結(jié)果:

2.對加密過的字符和原始數(shù)據(jù)進(jìn)行對比
案例:
public static void main(String[] args) {
String str = "123456";
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
String encode = bCryptPasswordEncoder.encode(str);
System.out.println(encode);
boolean matches1 = bCryptPasswordEncoder.matches(str, encode);
System.out.println(matches1);
}結(jié)果:

3.加密過的字符串直接與字符串對比
案例:
public static void main(String[] args) {
String str = "123456";
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
String encode = bCryptPasswordEncoder.encode(str);
boolean matches = encode.matches(str);
System.out.println(encode);
System.out.println(matches);
}結(jié)果:
由于str已經(jīng)被BCryptPasswordEncoder 加密過,再次使用加密過的matches對比,是不一樣的,加密過的str是一個新的對象encode ,新的對象encode 對比str,肯定是不一樣的,則會返回false。

整理:
//另外BCryptPasswordEncoder的使用: //加密: bcryptPasswordEncoder.encoder(password) //比較: bcrytPasswordEncoder.matches(rawPassword,encodedPassword)
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
重新生成.iml和.idea文件實(shí)現(xiàn)方式
這篇文章主要介紹了重新生成.iml和.idea文件實(shí)現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2026-03-03
Java?synchronized關(guān)鍵字性能考量及優(yōu)化探索
這篇文章主要為大家介紹了Java?synchronized關(guān)鍵字性能考量及優(yōu)化探索示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
idea如何解決commit代碼時一直code Analyze加載的問題
文章介紹了解決Git提交代碼時出現(xiàn)codeAnalyze加載卡頓問題的方法,即關(guān)閉IDEA中的相關(guān)設(shè)置選項(xiàng),作者分享個人經(jīng)驗(yàn),希望對大家有所幫助,并鼓勵支持腳本之家2025-01-01
Java實(shí)現(xiàn)實(shí)時視頻轉(zhuǎn)播的代碼示例
這篇文章主要給大家詳細(xì)介紹了Java如何實(shí)現(xiàn)實(shí)時視頻轉(zhuǎn)播,文中通過代碼實(shí)例介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴可以自己動手試一試2023-09-09
java實(shí)現(xiàn)微信支付結(jié)果通知
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)微信支付結(jié)果通知,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-01-01
java ConcurrentHashMap鎖分段技術(shù)及原理詳解
這篇文章主要介紹了java ConcurrentHashMap鎖分段技術(shù)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07
基于java中stack與heap的區(qū)別,java中的垃圾回收機(jī)制的相關(guān)介紹
本篇文章小編將為大家介紹,基于java中stack與heap的區(qū)別,java中的垃圾回收機(jī)制的相關(guān)介紹,需要的可以參考一下2013-04-04

