JAVA對字符串進行32位MD5加密的實踐
MD5簡單介紹
MD5 加密后的位數(shù)有兩種:16 位與 32 位。默認使用32位。 (16 位實際上是從 32 位字符串中取中間的第 9 位到第 24 位的部分)為提高安全性。根據(jù)業(yè)務(wù)需求,可以對md5 添加偏移量。如對原有字符拼接指定位數(shù)的字符串。
MD5信息摘要算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼散列函數(shù),可以產(chǎn)生出一個128位(16字節(jié))的散列值(hash value),用于確保信息傳輸完整一致。MD5由美國密碼學(xué)家羅納德·李維斯特(Ronald Linn Rivest)設(shè)計,于1992年公開,用以取代MD4算法。這套算法的程序在 RFC 1321 標準中被加以規(guī)范。1996年后該算法被證實存在弱點,可以被加以破解,對于需要高度安全性的數(shù)據(jù),專家一般建議改用其他算法,如SHA-2。2004年,證實MD5算法無法防止碰撞(collision),因此不適用于安全性認證,如SSL公開密鑰認證或是數(shù)字簽名等用途。
大家都知道,地球上任何人都有自己獨一無二的指紋,這常常成為公安機關(guān)鑒別罪犯身份最值得信賴的方法;與之類似,MD5就可以為任何文件(不管其大小、格式、數(shù)量)產(chǎn)生一個同樣獨一無二的“數(shù)字指紋”,如果任何人對文件做了任何改動,其MD5值也就是對應(yīng)的“數(shù)字指紋”就會發(fā)生變化。
MD5算法具有以下特點
1、壓縮性:任意長度的數(shù)據(jù),算出的MD5值長度都是固定的。
2、容易計算:從原數(shù)據(jù)計算出MD5值很容易。
3、抗修改性:對原數(shù)據(jù)進行任何改動,哪怕只修改1個字節(jié),所得到的MD5值都有很大區(qū)別。
4、強抗碰撞:已知原數(shù)據(jù)和其MD5值,想找到一個具有相同MD5值的數(shù)據(jù)(即偽造數(shù)據(jù))是非常困難的。

代碼1
public static void main(String[] args) {
String s ="202111012231046012000000111101705104827";
for (int i = 0; i <50 ; i++) {
System.out.println( EncodeByMD5(s).toUpperCase()+" 長度"+EncodeByMD5(s).toUpperCase().length());
}
}
/**
* 對字符串進行32位MD5加密
* @param str
* @return
*/
public static String EncodeByMD5(String str) {
try {
// 生成一個MD5加密計算摘要
MessageDigest md = MessageDigest.getInstance("MD5");
// 計算md5函數(shù)
md.update(str.getBytes("UTF-8"));
// digest()最后確定返回md5 hash值,返回值為8為字符串。因為md5 hash值是16位的hex值,實際上就是8位的字符
// BigInteger函數(shù)則將8位的字符串轉(zhuǎn)換成16位hex值,用字符串來表示;得到字符串形式的hash值
String md5=new BigInteger(1, md.digest()).toString(16);
//BigInteger會把0省略掉,需補全至32位
return fillMD5(md5);
} catch (Exception e) {
throw new RuntimeException("MD5加密錯誤:"+e.getMessage(),e);
}
}
private static String fillMD5(String md5){
//如果不夠32位則回調(diào)自身補零,最后返回32位長度的簽名
return md5.length()==32?md5:fillMD5("0"+md5);
}
MD5Util
package com.kuang.jiami;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Util {
//待加密的密碼
public static String password = "202111012231046012000000111101705104829";
public static void main(String args[]) {
//結(jié)果字符串
String result = "";
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(password.getBytes());
byte b[] = md.digest();
int i;
StringBuffer buf = new StringBuffer("");
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if (i < 0)
i += 256;
if (i < 16)
buf.append("0");
buf.append(Integer.toHexString(i));
}
result = buf.toString();
System.out.println("MD5(" + password + ",32小寫) = " + result);
System.out.println("MD5(" + password + ",32大寫) = " + result.toUpperCase());
System.out.println("++++++++++++++++++++++++各位大哥借過+++++++++++++++++++++++");
System.out.println("MD5(" + password + ",16小寫) = " + buf.toString().substring(8, 24));
System.out.println("MD5(" + password + ",16大寫) = " + buf.toString().substring(8, 24).toUpperCase());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
}
MD5Helper
package com.kuang.jiami;
import java.security.MessageDigest;
public class MD5Helper {
public static String encrypt32(String encryptStr) {
MessageDigest md5;
try {
md5 = MessageDigest.getInstance("MD5");
byte[] md5Bytes = md5.digest(encryptStr.getBytes());
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < md5Bytes.length; i++) {
int val = ((int) md5Bytes[i]) & 0xff;
if (val < 16)
hexValue.append("0");
hexValue.append(Integer.toHexString(val));
}
encryptStr = hexValue.toString();
} catch (Exception e) {
throw new RuntimeException(e);
}
return encryptStr;
}
public static String encrypt16(String encryptStr) {
return encrypt32(encryptStr).substring(8, 24);
}
public static void main(String[] args) {
String encryptStr = "202111012231046012000000111101705104829";
System.out.println(MD5Helper.encrypt32(encryptStr).toUpperCase());
System.out.println(MD5Helper.encrypt16(encryptStr).toUpperCase());
}
}
到此這篇關(guān)于JAVA對字符串進行32位MD5加密的實踐的文章就介紹到這了,更多相關(guān)JAVA 字符串32位MD5加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Mybatis-plus實現(xiàn)時間自動填充(代碼直接可用)
這篇文章主要介紹了使用Mybatis-plus實現(xiàn)時間自動填充(代碼直接可用),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
SpringBoot中調(diào)用通用URL的實現(xiàn)
在 Spring Boot 應(yīng)用程序中,有時候我們需要調(diào)用一些通用的 URL 接口,本文主要介紹了SpringBoot中調(diào)用通用URL的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07

