加密算法之 MD5算法

Posted ywjfx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了加密算法之 MD5算法相关的知识,希望对你有一定的参考价值。

题记:本人自测了很多次,该算法和apache的commons utils包中的MD5算法计算一致

一、针对文件内容生成MD5值

应用场景针对文件,在传输过程由于网络原因丢帧或者被人别恶意篡改内容,可以通过源文件的MD5和下载后的文件MD5值进行比较,如果一致说明文件内容相同,否则下载的文件有问题。

  该MD5代码计算这个文件内容,生成一个MD5值。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Util {
    /**
     * 一次性处理的文件字节数
     */
    private static final int ONE_HANDLE_FILE_BYTE_COUNT = 8192;

    /**
     * MD5 算法
     */
    private static final String MD5_ALGORITHM = "MD5";

    /**
     * 无数据的索引值
     */
    private static final int NOT_DATA_INDEX = -1;

    /**
     * 正数符号
     */
    private static final int POSITIVE_SIGN = 1;

    /**
     * 十六进制
     */
    private static final int HEXADECIMAL = 16;

    /**
     * 生成文件内容的 MD5 值
     *
     * @param file
     * @return
     */
    public static String generateMD5(File file) {
        if (!file.isFile())//不是文件
            return null;

        MessageDigest digest;
        FileInputStream in = null;
        byte buffer[] = new byte[ONE_HANDLE_FILE_BYTE_COUNT];
        int len;
        try {
            digest = MessageDigest.getInstance(MD5_ALGORITHM);
            in = new FileInputStream(file);

            while ((len = in.read(buffer)) != NOT_DATA_INDEX) {
                digest.update(buffer, 0, len);
            }
            BigInteger bigInteger = new BigInteger(POSITIVE_SIGN, digest.digest());
            return bigInteger.toString(HEXADECIMAL);
        } catch (NoSuchAlgorithmException e) {
            //logger.error(" 生成文件内容的 MD5", e);
            e.printStackTrace();
            return null;
        } catch (FileNotFoundException e) {
            //logger.error(" 生成文件内容的 MD5", e);
            e.printStackTrace();
            return null;
        } catch (IOException e) {
           // logger.error(" 生成文件内容的 MD5", e);
            e.printStackTrace();
            return null;
        } finally {
            try {
                in.close();
            } catch (Exception e) {
                e.printStackTrace();
               // logger.error("关闭文件", e);
            }
        }
    }

       /* public static void main (String[]args){

           String md5 = MD5Util.generateMD5( new File("D:\\ip_20180823102738.txt"));
           System.out.println(md5);
        }*/

    }

 

二、针对字符串生成MD5值

应用场景:参数传输,保证参数的一致性

  这里采用apache的commons包中的MD5工具类计算。

import org.apache.commons.codec.digest.DigestUtils;
public class MD5Util {  
  public static void main (String[]args){
           String md5Test="MD5摘要算法"; 
           System.out.println(md5Test);
           String md5Hex = DigestUtils.md5Hex(md5Test);  #使用工具类对字符串生成MD5值
           System.out.print(md5Hex);
        }
}

Apache的commons包下载地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi

##想了解更多加密算法,可以看https://www.cnblogs.com/ywjfx/p/9902628.html

以上是关于加密算法之 MD5算法的主要内容,如果未能解决你的问题,请参考以下文章

java加密算法之MD5篇

java加密算法之MD5篇

每天找回一点点之MD5加密算法

Android数据加密之MD5加密探讨与总结

使用python之MD5进行加密

常见用户密码加密方式之特殊的单向HASH算法