在各種應用系統(tǒng)中尤莺,如果需要設置賬戶旅敷,那么就會涉及到儲存用戶賬戶信息的問題,
為了保證所儲存賬戶信息的安全颤霎,通常會采用MD5加密的方式來媳谁,進行儲存。首先友酱,簡單得介紹一下晴音,
什么是MD5加密。
MD5的全稱是Message-Digest Algorithm 5(信息-摘要算法)缔杉,
在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的Ronald L. Rivest
開發(fā)出來锤躁,經(jīng)MD2、MD3和MD4發(fā)展而來或详。是讓大容量信息在用數(shù)字簽名軟件簽署私人密匙前被"壓縮"成一種保密的格式(就是把一個任意長度的
字節(jié)串變換成一定長的大整數(shù))系羞。不管是MD2、MD4還是MD5霸琴,它們都需要獲得一個隨機長度的
信息并產(chǎn)生一個128位的信息摘要座柱。雖然這些算法的結(jié)構(gòu)或多或少有些相似慕蔚,但MD2的設計與MD4
和MD5完全不同织阳,那是因為MD2是為8位機器做過設計優(yōu)化的踩晶,而MD4和MD5卻是面向32位的電腦。
這三個算法的描述和C語言源代碼在Internet RFCs 1321中有詳細的描述,這是一份最權(quán)威的文檔嗡善,
由Ronald L. Rivest在1992年8月向IETF提交辑莫。
(一)消息摘要簡介
一個消息摘要就是一個數(shù)據(jù)塊的數(shù)字指紋。即對一個任意長度的一個數(shù)據(jù)塊進行計算罩引,
產(chǎn)生一個唯一指痈鞫帧(對于SHA1是產(chǎn)生一個20字節(jié)的二進制數(shù)組)。消息摘要是一種與消息
認證碼結(jié)合使用以確保消息完整性的技術(shù)袁铐。主要使用單向散列函數(shù)算法揭蜒,可用于檢驗消息的
完整性,和通過散列密碼直接以文本形式保存等剔桨,目前廣泛使用的算法有MD4屉更、MD5、SHA-1洒缀。
消息摘要有兩個基本屬性:
兩個不同的報文難以生成相同的摘要
難以對指定的摘要生成一個報文瑰谜,而可以由該報文反推算出該指定的摘要
代表:美國國家標準技術(shù)研究所的SHA1和麻省理工學院Ronald Rivest提出的MD5
(二)對字符串進行加密
/**利用MD5進行加密
* @param str 待加密的字符串
* @return 加密后的字符串
* @throws NoSuchAlgorithmException 沒有這種產(chǎn)生消息摘要的算法
* @throws UnsupportedEncodingException
*/
public String EncoderByMd5(String str) throws NoSuchAlgorithmException, UnsupportedEncodingException{
//確定計算方法
MessageDigest md5=MessageDigest.getInstance("MD5");
BASE64Encoder base64en = new BASE64Encoder();
//加密后的字符串
String newstr=base64en.encode(md5.digest(str.getBytes("utf-8")));
return newstr;
}
/**
* 實際運用md5加密
* @param str
* @return
*/
@RequestMapping("/MD5")
public static String MD5(String str){
if(StringUtils.isNullOrEmpty(str)){
return null;
}else{
return DigestUtils.md5Hex(str);
}
}
導入jar
<!---算法加密-->
<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.9</version>
</dependency>
調(diào)用函數(shù):
String str="909"
System.out.println(EncoderByMd5(str));
輸出:pDALACvPtx8pHawXXVLflA==
(三)驗證密碼是否正確
因為MD5是基于消息摘要原理的,消息摘要的基本特征就是很難根據(jù)摘要推算出消息報文树绩,
因此要驗證密碼是否正確萨脑,就必須對輸入密碼(消息報文)重新計算其摘要,和數(shù)據(jù)庫中
存儲的摘要進行對比(即數(shù)據(jù)庫中存儲的其實為用戶密碼的摘要)饺饭,若兩個摘要相同渤早,
則說明密碼正確,不同瘫俊,則說明密碼錯誤鹊杖。
/**判斷用戶密碼是否正確
* @param newpasswd 用戶輸入的密碼
* @param oldpasswd 數(shù)據(jù)庫中存儲的密碼--用戶密碼的摘要
* @return
* @throws NoSuchAlgorithmException
* @throws UnsupportedEncodingException
*/
public boolean checkpassword(String newpasswd,String oldpasswd) throws
NoSuchAlgorithmException, UnsupportedEncodingException{
if(EncoderByMd5(newpasswd).equals(oldpasswd))
return true;
else
return false;
}