BCryptPasswordEncoder加密與MD5加密的區(qū)別及說明
MD5加密說明
MD5(Message Digest Algorithm 5)中文名為消息摘要算法第五版,是計(jì)算機(jī)安全領(lǐng)域廣泛使用的一種散列函數(shù),用以提供消息的完整性保護(hù)。
MD5作為一種常用的摘要算法(或指紋算法),其具有以下幾個(gè)重要的特點(diǎn)(個(gè)人觀點(diǎn)):
輸入任意長(zhǎng)度信息,輸出長(zhǎng)度固定:
- MD5 可輸入任意長(zhǎng)度的信息,其輸出均為128位(bit)固定長(zhǎng)度的二進(jìn)制數(shù)據(jù)。
運(yùn)算速度快:
- MD5的運(yùn)算均為32位 與、或、非、位移等位運(yùn)算,因此其運(yùn)算速率快,幾乎不消耗CPU時(shí)間。
不可逆:
- 根據(jù)MD5的的散列結(jié)果,無法計(jì)算出原始數(shù)據(jù)(查字典除外)。
碰撞性:
- 原始數(shù)據(jù)與其MD5散列結(jié)果并非一一對(duì)應(yīng),存在多個(gè)原始數(shù)據(jù)的MD5結(jié)果相同的可能性。
不安全:
- 2011年,RFC 6151 禁止MD5用作密鑰散列消息認(rèn)證碼。
- MD5計(jì)算結(jié)果一般為長(zhǎng)度為32的字符串,偶爾也會(huì)遇到長(zhǎng)度為16的字符串,MD5散列結(jié)果是128位(bit)固定長(zhǎng)度的二進(jìn)制數(shù)據(jù),也就是128個(gè)0/1的二進(jìn)數(shù)據(jù)。
2011年后MD5加密算法可以被反推出來明文,被破解,已經(jīng)不推薦使用
案例使用
1.字符串
//加密為字符串返回 DigestUtils.md5DigestAsHex("123456".getBytes()); //結(jié)果為:e10adc3949ba59abbe56e057f20f883e
2.byte[]字節(jié)返回
//加密字節(jié)返回 DigestUtils.md5Digest("123456".getBytes()); //結(jié)果為:[B@49476842
3.在字符串后追加加密字符返回StringBuilder
StringBuilder stringBuilder1 = DigestUtils.appendMd5DigestAsHex(bytes,new StringBuilder("123456")); //結(jié)果:1234564280d89a5a03f812751f504cc10ee8a5
解密的話,在java中還沒有提供方法,但是有些網(wǎng)站是可以對(duì)MD5進(jìn)行解密的
4. 如果對(duì)字符換加密過的字符串再次進(jìn)行加密,則會(huì)出現(xiàn)一樣的加密結(jié)果。
案例:
BCryptPasswordEncoder說明
BCrypt 是一種密碼散列函數(shù),即單向函數(shù)。
- 您無法解密 BCrypt 哈希,就像您無法從雞肉麥塊返回原始雞肉一樣。
- 您只能驗(yàn)證兩個(gè) BCrypt 哈希值是否相同,從而驗(yàn)證提供的密碼是否與原始密碼匹配。
一個(gè)典型的解決方案是向用戶發(fā)送一次性密碼重置鏈接,使用秘密問題或其他一些確認(rèn)用戶身份的信息讓他們?cè)O(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.對(duì)加密過的字符和原始數(shù)據(jù)進(jìn)行對(duì)比
案例:
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.加密過的字符串直接與字符串對(duì)比
案例:
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對(duì)比,是不一樣的,加密過的str是一個(gè)新的對(duì)象encode ,新的對(duì)象encode 對(duì)比str,肯定是不一樣的,則會(huì)返回false。
整理:
//另外BCryptPasswordEncoder的使用: //加密: bcryptPasswordEncoder.encoder(password) //比較: bcrytPasswordEncoder.matches(rawPassword,encodedPassword)
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
mybatis3中@SelectProvider傳遞參數(shù)方式
這篇文章主要介紹了mybatis3中@SelectProvider傳遞參數(shù)方式。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Java實(shí)現(xiàn)的簡(jiǎn)單畫圖板示例
這篇文章主要介紹了Java實(shí)現(xiàn)的簡(jiǎn)單畫圖板,涉及java使用swing組件進(jìn)行圖形繪制相關(guān)操作技巧,需要的朋友可以參考下2018-08-08SpringBoot Mybatis Plus公共字段自動(dòng)填充功能
這篇文章主要介紹了SpringBoot Mybatis Plus公共字段自動(dòng)填充功能的相關(guān)資料,需要的朋友可以參考下2017-04-04Java實(shí)現(xiàn)圖章或簽名插在pdf的固定位置
使用Java技術(shù)在word轉(zhuǎn)換成pdf過程中實(shí)現(xiàn)將圖章或者簽名插入在pdf中,并生成帶圖章或者簽名的pdf,來完成某些特定場(chǎng)景的需求,文中有詳細(xì)的代碼示例,需要的朋友可以參考下2023-10-10MyBatis-Plus實(shí)現(xiàn)多表聯(lián)查的方法實(shí)戰(zhàn)
這篇文章主要給大家介紹了關(guān)于MyBatis-Plus實(shí)現(xiàn)多表聯(lián)查的方法,MyBatis Plus是一款針對(duì)MyBatis框架的增強(qiáng)工具,它提供了很多方便的方法來實(shí)現(xiàn)多表聯(lián)查,需要的朋友可以參考下2023-07-07SpringBoot+LayIM+t-io 實(shí)現(xiàn)好友申請(qǐng)通知流程
這篇文章主要介紹了 SpringBoot+LayIM+t-io 實(shí)現(xiàn)好友申請(qǐng)通知流程,本文圖文并茂給大家介紹的非常詳細(xì),需要的朋友可以參考下2017-12-12Java?ConcurrentHashMap實(shí)現(xiàn)線程安全的代碼示例
眾所周知ConcurrentHashMap是HashMap的多線程版本,HashMap?在并發(fā)操作時(shí)會(huì)有各種問題,而這些問題,只要使用ConcurrentHashMap就可以完美解決了,本文將給詳細(xì)介紹ConcurrentHashMap是如何保證線程安全的2023-05-05