一文搞懂Java MD5算法的原理及实现

网友投稿 507 2022-07-24


目录MD5加密简介MD5加密原理MD5加密常用方法

MD5加密简介

哈希算法又称散列算法,是将任何数据转换成固定长度的算法的统称。 从本质上讲,MD5也是一种哈希算法,其输出是生成128位的输出结果。 如果输入两个不同的明文,就会输出两个不同的输出值,并且根据输出值,不能得到原始的明文,这个过程是不可逆的。

MD5加密原理

MD5算法对512位报文的输入信息进行处理,每个报文被分成16个32位报文。 经过一系列处理后,算法的输出由4个32位的数据包组成,这些数据包级联生成一个128位的哈希值。

在MD5算法中,信息的填写方式是这样的:消息后面跟着一个1,然后是无数个0,直到512字节的剩余数等于448 (n*512) + 448。 为什么剩下的是448,因为剩下的512-448是64位,表示填充前的消息长度。 加上剩下的64位,(n+1)乘以512,也就是512的整数倍。

然后循环通过link变量获得结果。 MD5包含四个32位整数参数,称为链接变量:A=0x01234567, B= 0x89ABCdef, C= 0xFeDCba98, D=0x76543210。 一旦设置好四个链接变量,算法就开始了四轮循环。 具体的内部计算是关于数学的。如果你感兴趣,你可以自己理解。这里没有更多的解释。

MD5加密常用方法

/**

* 用MD5算法进行加密

* @param str 需要加密的字符串

* @return MD5加密后的结果

* @throws UnsupportedEncodingException

*/

public static String encodeMD5String(String str) {

return getMD5(str);

}

/**

uLvDVCAEJi * MD5编码方法, 该方法存在漏洞,特殊情况下编码后的字符串只有31位长度

* @param str

* @param method

* @return

* @throws UnsupportedEncodingException

*/

private static String encode(String str, String method) throws UnsupportedEncodingException {

MessageDigest md = null;

String dstr = null;

try {

md = MessageDigest.getInstance(method);

md.update(str.getBytes("UTF-8"));

dstr = new BigInteger(1, md.digest()).toString(16);

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

return dstr;

}

/**

* MD5编码方法

* @param message

* @return

*/

public static String getMD5(String message) {

MessageDigest messageDigest = null;

StringBuffer md5StrBuff = new StringBuffer();

try {

messageDigest = MessageDigest.getInstance("MD5");

messageDigest.reset();

messageDigest.update(message.getBytes("UTF-8"));

byte[] byteArray = messageDigest.digest();

for (int i = 0; i < byteArray.length; i++)

{

if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)

md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));

else

md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));

}

} catch (Exception e) {

throw new RuntimeException();

}

return md5StrBuff.toString().toUpperCase();//字母大写

}

/**

* 加密

* @param content

* @return

*/

public static String encrypt(String content) {

String password = "12345678dd";

byte[] encryptResult = encrypt(content, password);

String encryptResultStr = parseByte2HexStr(encryptResult);

return encryptResultStr;

}

/**

* 加uLvDVCAEJi密

* @param content

* @param password

* @return

*/

public static String uLvDVCAEJiencryptStr(String content, String password) {

byte[] encryptResult = encrypt(content, password);

return parseByte2HexStr(encryptResult);

}

/**

* 解密

* @param encryptResultStr

* @return

* @throws UnsupportedEncodingException

*/

public static String decrypt(String encryptResultStr) throws UnsupportedEncodingException {

String password = "12345678dd";

byte[] decryptFrom = parseHexStr2Byte(encryptResultStr);

byte[] decryptResult = decrypt(decryptFrom, password);

// 解密内容进行解码

String result = new String(decryptResult, UTF8);

return result;

}

/**

* 解密

* @param encryptStr

* @param password

* @return

* @throws UnsupportedEncodingException

*/

public static String decryptStr(String encryptStr, String password) throws UnsupportedEncodingException {

byte[] decryptFrom = parseHexStr2Byte(encryptStr);

byte[] decryptResult = decrypt(decryptFrom, password);

// 解密内容进行解码

return new String(decryptResult, UTF8);

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java实现窗体程序显示日历
下一篇:Spring中Bean的单例和多例使用说明
相关文章

 发表评论

暂时没有评论,来抢沙发吧~