java不可逆加密算法之md5加密算法使用示例
MD5的全稱是Message-Digest Algorithm 5,Message-Digest泛指字節(jié)串(Message)的Hash變換,就是把一個(gè)任意長度的字節(jié)串變換成一定長的大整數(shù)。MD5將任意長度的"字節(jié)串"變換成一個(gè)128bit的大整數(shù),并且它是一個(gè)不可逆的字符串變換算法,換句話說就是,即使你看到源程序和算法描述,也無法將一個(gè)MD5的值變換回原始的字符串,從數(shù)學(xué)原理上說,是因?yàn)樵嫉淖址袩o窮多個(gè),這有點(diǎn)象不存在反函數(shù)的數(shù)學(xué)函數(shù)。
import java.security.MessageDigest;
public class Test_MD5{
public final static String MD5(String s) {
char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f' };
try {
byte[]strTemp=s.getBytes();
//使用MD5創(chuàng)建MessageDigest對(duì)象
MessageDigestmdTemp=MessageDigest.getInstance("MD5");
mdTemp.update(strTemp);
byte[]md=mdTemp.digest();
intj=md.length;
charstr[]=newchar[j*2];
intk=0;
for(inti=0;i<j;i++){
byteb=md[i];
//System.out.println((int)b);
//將沒個(gè)數(shù)(int)b進(jìn)行雙字節(jié)加密
str[k++]=hexDigits[b>>4&0xf];
str[k++]=hexDigits[b&0xf];
}
returnnewString(str);
}catch(Exceptione){returnnull;}
}
//測試
publicstaticvoidmain(String[]args){
System.out.println("caidao的MD5加密后:\n"+Test_MD5.MD5("caidao"));
System.out.println("http://www.dbjr.com.cn/的MD5加密后:\n"+Test_MD5.MD5("http://www.dbjr.com.cn/"));
}
}
MD5的典型應(yīng)用是對(duì)一段Message(字節(jié)串)產(chǎn)生fingerprint(指紋),以防止被"篡改"。舉個(gè)例子,你將一段話寫在一個(gè)叫readme.txt文件中,并對(duì)這個(gè)readme.txt產(chǎn)生一個(gè)MD5的值并記錄在案,然后你可以傳播這個(gè)文件給別人,別人如果修改了文件中的任何內(nèi)容,你對(duì)這個(gè)文件重新計(jì)算MD5時(shí)就會(huì)發(fā)現(xiàn)。如果再有一個(gè)第三方的認(rèn)證機(jī)構(gòu),用MD5還可以防止文件作者的"抵賴",這就是所謂的數(shù)字****應(yīng)用。
MD5還廣泛用于加密和解密技術(shù)上,在很多操作系統(tǒng)中,用戶的密碼是以MD5值(或類似的其它算法)的方式保存的,用戶Login的時(shí)候,系統(tǒng)是把用戶輸入的密碼計(jì)算成MD5值,然后再去和系統(tǒng)中保存的MD5值進(jìn)行比較,而系統(tǒng)并不"知道"用戶的密碼是什么。
MD5理論上是一種單向的哈希散列,一些黑客破獲這種密碼的方法是一種被稱為"跑字典"的方法。有兩種方法得到字典,一種是日常搜集的用做密碼的字符串表,另一種是用排列組合方法生成的,先用MD5程序計(jì)算出這些字典項(xiàng)的MD5值,然后再用目標(biāo)的MD5值在這個(gè)字典中檢索。
即使假設(shè)密碼的最大長度為8,同時(shí)密碼只能是字母和數(shù)字,共26+26+10=62個(gè)字符,排列組合出的字典的項(xiàng)數(shù)則是P(62,1)+P(62,2)....+P(62,8),那也已經(jīng)是一個(gè)很天文的數(shù)字了,存儲(chǔ)這個(gè)字典就需要TB級(jí)的磁盤組,而且這種方法還有一個(gè)前提,就是能獲得目標(biāo)賬戶的密碼MD5值的情況下才可以。
相關(guān)文章
詳解 Java繼承關(guān)系下的構(gòu)造方法調(diào)用
這篇文章主要介紹了詳解 Java繼承關(guān)系下的構(gòu)造方法調(diào)用的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10java jvm兩種存儲(chǔ)區(qū)的類型知識(shí)點(diǎn)講解
在本篇文章里小編給大家整理的是一篇關(guān)于java jvm兩種存儲(chǔ)區(qū)的類型知識(shí)點(diǎn)講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-03-03使用SpringBoot開發(fā)Restful服務(wù)實(shí)現(xiàn)增刪改查功能
Spring Boot是由Pivotal團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程。這篇文章主要介紹了基于SpringBoot開發(fā)一個(gè)Restful服務(wù),實(shí)現(xiàn)增刪改查功能,需要的朋友可以參考下2018-01-01java使用Socket實(shí)現(xiàn)文件上傳功能
這篇文章主要為大家詳細(xì)介紹了java使用Socket實(shí)現(xiàn)文件上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02淺析非對(duì)稱加密在接口參數(shù)中的實(shí)現(xiàn)
接口層做數(shù)據(jù)加密應(yīng)該算是老生常談的一件事了,業(yè)界用的比較多的,不外乎是對(duì)稱加密,非對(duì)稱加密以及兩者的結(jié)合。本文就來聊聊非對(duì)稱加密在接口參數(shù)中的實(shí)現(xiàn),希望對(duì)大家有所幫助2023-02-02