Java实现MD5加密的⽅式与实例代码
1、什么是MD5
  MD5加密全程是Message-Digest Algoorithm 5(信息-摘要算法),它对信息进⾏摘要采集,再通过⼀定的位运算,最终获取加密后的MD5字符串。
  例如我们要加密⼀篇⽂章,那么我们会随机从每段话或者每⾏中获取⼀个字,把这些字统计出来后,再通过⼀定的运算获得⼀个固定长度的MD5加密后信息。因此,其很难被逆向破解。
2、MD5有哪些特点
MD5加密的特点主要有以下⼏点:
  1、针对不同长度待加密的数据、字符串等等,其都可以返回⼀个固定长度的MD5加密字符串。(通常32位的16进制字符串);
  2、其加密过程⼏乎不可逆,除⾮维护⼀个庞⼤的Key-Value数据库来进⾏碰撞破解,否则⼏乎⽆法解开。
  3、运算简便,且可实现⽅式多样,通过⼀定的处理⽅式也可以避免碰撞算法的破解。
  4、对于⼀个固定的字符串。数字等等,MD5加密后的字符串是固定的,也就是说不管MD5加密多少次,都是同样的结果。
  3、Java中MD5加密的实现⽅式
具体废话不多说,直接上代码:
public static String getMD5String(String str) {
try {
// ⽣成⼀个MD5加密计算摘要
MessageDigest md = Instance("MD5");
// 计算md5函数
md.Bytes());
// digest()最后确定返回md5 hash值,返回值为8位字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
// BigInteger函数则将8位的字符串转换成16位hex值,⽤字符串来表⽰;得到字符串形式的hash值
//⼀个byte是⼋位⼆进制,也就是2位⼗六进制字符(2的8次⽅等于16的2次⽅)
return new BigInteger(1, md.digest()).toString(16);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
上述的是利⽤Java⾃带的MessageDigest类实现的最简单的MD5加密⽅法。对加密过程没有做任何处理。下⾯这个相对来说更加复杂。all.util;
import java.security.MessageDigest;
/**
* Created by dt
*/
public class MD5Util {
  //这⾥主要是遍历8个byte,转化为16位进制的字符,即0-F
private static String byteArrayToHexString(byte b[]) {
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i < b.length; i++)
resultSb.append(byteToHexString(b[i]));
String();
java加密方式有哪些}
  //这⾥是针对单个byte,256的byte通过16拆分为d1和d2
private static String byteToHexString(byte b) {
int n = b;
if (n < 0)
n += 256;
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + hexDigits[d2];
}
/**
* 返回⼤写MD5
*
* @param origin
* @param charsetname
* @return
*/
private static String MD5Encode(String origin, String charsetname) {
String resultString = null;
try {
resultString = new String(origin);
MessageDigest md = Instance("MD5");
if (charsetname == null || "".equals(charsetname))
resultString = byteArrayToHexString(md.Bytes()));
else
resultString = byteArrayToHexString(md.Bytes(charsetname)));
} catch (Exception exception) {
}
UpperCase();
}
public static String MD5EncodeUtf8(String origin) {
origin = origin + Property("password.salt", "");
return MD5Encode(origin, "utf-8");
}
private static final String hexDigits[] = {"0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
}
//在这段代码⾥⾯还引⼊了Property("password.salt","")来获取⼀个额外的字符串,以保证碰撞算法的命中率更低,且在第三⽅MD5平台上也很难被搜索到。password.salt = 23543dfggeelysdafaqj23ou89ZXcj@#$@#$#@KJdjklj;D../dSF.,
还有个更详细的版本,妇幼更详细的注释:
public static String stringMD5(String input) {
try {
// 拿到⼀个MD5转换器(如果想要SHA1参数换成”SHA1”)
MessageDigest messageDigest =Instance("MD5");
// 输⼊的字符串转换成字节数组
byte[] inputByteArray = Bytes();
// inputByteArray是输⼊字符串转换得到的字节数组
messageDigest.update(inputByteArray);
// 转换并返回结果,也是字节数组,包含16个元素
byte[] resultByteArray = messageDigest.digest();
// 字符数组转换成字符串返回
return byteArrayToHex(resultByteArray);
} catch (NoSuchAlgorithmException e) {
return null;
}
}
下⾯这个函数⽤于将字节数组换成成16进制的字符串
public static String byteArrayToHex(byte[] byteArray) {
// ⾸先初始化⼀个字符数组,⽤来存放每个16进制字符
char[] hexDigits = {'0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F' };
// new⼀个字符数组,这个就是⽤来组成结果字符串的(解释⼀下:⼀个byte是⼋位⼆进制,也就是2位⼗六进制字符(2的8次⽅等于16的2次⽅))
char[] resultCharArray =new char[byteArray.length * 2];
// 遍历字节数组,通过位运算(位运算效率⾼),转换成字符放到字符数组中去
int index = 0;
for (byte b : byteArray) {
resultCharArray[index++] = hexDigits[b>>> 4 & 0xf];
resultCharArray[index++] = hexDigits[b& 0xf];
}
// 字符数组组合成字符串返回
return new String(resultCharArray);
}
到此这篇关于Java实现MD5加密的⽅式与实例代码的⽂章就介绍到这了,更多相关Java MD5内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。