2025年Java实现MD5加密的方式

Java实现MD5加密的方式MD5 加密是一种常见的加密方式 我们经常用在保存用户密码和关键信息上 那么它到底有什么 又什么好处呢 会被这么广泛的运用在应用开发中 1 什么是 MD5 MD5 加密全程是 Message Digest Algoorithm 5 信息 摘要算法 它对信息进行摘要采集 再通过一定的位运算 最终获取加密后的 MD5 字符串 例如我们要加密一篇文章

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 = MessageDigest.getInstance("MD5");
// 计算md5函数
md.update(str.getBytes());
// 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加密方法。对加密过程没有做任何处理。下面这个相对来说更加复杂。

package com.mmall.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]));

return resultSb.toString();
}
//这里是针对单个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 = MessageDigest.getInstance("MD5");
if (charsetname == null || "".equals(charsetname))
resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
else
resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));
} catch (Exception exception) {
}
return resultString.toUpperCase();
}

public static String MD5EncodeUtf8(String origin) {
origin = origin + PropertiesUtil.getProperty("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"};

}

//在这段代码里面还引入了PropertiesUtil.getProperty("password.salt","")来获取一个额外的字符串,以保证碰撞算法的命中率更低,且在第三方MD5平台上也很难被搜索到。
password.salt = 23543dfggeelysdafaqj23ou89ZXcj@#$@#$#@KJdjklj;D../dSF.,

还有个更详细的版本,妇幼更详细的注释:

public static String stringMD5(String input) {

try {

// 拿到一个MD5转换器(如果想要SHA1参数换成”SHA1”)

MessageDigest messageDigest =MessageDigest.getInstance("MD5");



// 输入的字符串转换成字节数组

byte[] inputByteArray = input.getBytes();



// 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);
}

这两处代码出自https://www.cnblogs.com/hihtml5/p/6064999.html

编程小号
上一篇 2025-03-13 11:21
下一篇 2025-02-26 12:17

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/130066.html