JAVA对字符串进行32位MD5加密的实践

目录
  • MD5简单介绍
  • 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值的数据(即伪造数据)是非常困难的。

代码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函数
        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

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

到此这篇关于JAVA对字符串进行32位MD5加密的实践的文章就介绍到这了,更多相关JAVA 字符串32位MD5加密内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java编程下字符串的16位,32位md5加密实现方法

    如下所示: package cn.sunzn.md5; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class Str2MD5 { public static void main(String[] args) { MD5("sunzn"); } private static String MD5(String sourceStr) { String r

  • java,android,MD5加密算法的实现代码(16位,32位)

    如下所示: import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class Md5 { public static String getMD5(String val) throws NoSuchAlgorithmException{ MessageDigest md5 = MessageDigest.getInstance("MD5"); md5.update

  • JAVA对字符串进行32位MD5加密的实践

    目录 MD5简单介绍 MD5算法具有以下特点 MD5简单介绍 MD5 加密后的位数有两种:16 位与 32 位.默认使用32位. (16 位实际上是从 32 位字符串中取中间的第 9 位到第 24 位的部分)为提高安全性.根据业务需求,可以对md5 添加偏移量.如对原有字符拼接指定位数的字符串. MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完

  • VB实现的16位和32位md5加密代码分享

    在各种登陆系统中,用户密码的md5加密是不可少的. 这么说吧,即使你通过各种手段看到了用户的登陆密码,但那一串古古怪怪的东西你也不可能知道它是什么,这就是保护. md5加密运算是不可逆的,就是说你不能通过那一串古古怪怪的东西算出它原始的样子. 下面是完整的md5代码,不要去理解算法了,用到时拿去直接调用. Private Const BITS_TO_A_BYTE = 8 Private Const BYTES_TO_A_WORD = 4 Private Const BITS_TO_A_WORD

  • C#实现将32位MD5摘要串转换为128位二进制字符串的方法

    本文实例讲述了C#实现将32位MD5摘要串转换为128位二进制字符串的方法.分享给大家供大家参考,具体如下: 将32为MD5摘要串转换为128位二进制字符串: /// <summary> /// 将字符串转成二进制 /// </summary> /// <param name="s">源字符串</param> /// <returns>二进制串</returns> internal static string Co

  • java中常用工具类之字符串操作类和MD5加密解密类

    java中常用的工具类之String和MD5加密解密类 我们java程序员在开发项目的是常常会用到一些工具类.今天我分享一下我的两个工具类,大家可以在项目中使用. 一.String工具类 package com.itjh.javaUtil; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import

  • java利用Apache commons codec进行MD5加密,BASE64加密解密,执行系统命令

    编写代码之前先来介绍一下我们要用到的两个包; commons-codec-1.10.jar Commons项目中用来处理常用的编码方法的工具类包,例如DES.SHA1.MD5.Base64,URL,Soundx等等. commons-exec-1.3.jar Apache Commons Exec 是 Apache 上的一个 Java 项目,提供一些常用的方法用来执行外部进程 你可以到本站直接下载 Apache Commons 官方包 下面看一下代码结构: import org.apache.c

  • php实现MD5加密16位(不要默认的32位)

    使用substr函数截取: 复制代码 代码如下: substr(md5("admin"),8,16); // 16位MD5加密 md5("admin"); // 32位MD5加密

  • .net core使用MD5加密解密字符串

    本文实例为大家分享了.net core使用MD5加密解密字符串的具体代码,供大家参考,具体内容如下 /// <summary> /// 加密 /// </summary> /// <param name="Text">要加密的文本</param> /// <param name="sKey">秘钥</param> /// <returns></returns> publi

  • php md5下16位和32位的实现代码

    复制代码 代码如下: <?php   echo substr(md5("admin"),8,16);  // 16位MD5加密   echo "<hr>";   echo md5("admin");    // 32位MD5加密   ?> 16位的MD5加密用substr函数截取了字符得到实现.... 不想深入研究了 :)  要把脑力放到其他关键的地方~~ 今天做了个php链接mssql数据库,数据库中的表中字段使用MD5

  • 基于C#对用户密码使用MD5加密与解密

    C#中常涉及到对用户密码的加密于解密的算法,其中使用MD5加密是最常见的的实现方式.本文总结了通用的算法并结合了自己的一点小经验,分享给大家. 一.使用16位.32位.64位MD5方法对用户名加密 1)16位的MD5加密 /// <summary> /// 16位MD5加密 /// </summary> /// <param name="password"></param> /// <returns></returns&

随机推荐