JAVA对字符串进行32位MD5加密的实践
作者:yujkss
本文主要介绍了JAVA对字符串进行32位MD5加密的实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
MD5简单介绍
MD5 加密后的位数有两种:16 位与 32 位。默认使用32位。 (16 位实际上是从 32 位字符串中取中间的第 9 位到第 24 位的部分)为提高安全性。根据业务需求,可以对md5 添加偏移量。如对原有字符拼接指定位数的字符串。
MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。
大家都知道,地球上任何人都有自己独一无二的指纹,这常常成为公安机关鉴别罪犯身份最值得信赖的方法;与之类似,MD5就可以为任何文件(不管其大小、格式、数量)产生一个同样独一无二的“数字指纹”,如果任何人对文件做了任何改动,其MD5值也就是对应的“数字指纹”就会发生变化。
MD5算法具有以下特点
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
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函数
md.update(str.getBytes("UTF-8"));
// digest()最后确定返回md5 hash值,返回值为8为字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
// BigInteger函数则将8位的字符串转换成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位则回调自身补零,最后返回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[]) {
//结果字符串
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