阿杰带你了解MD5算法

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

前言

MD5算法最初是由麻省理工实验室和RSA机构发明的,其发展历程是由MD2,MD3,MD4传承而来。

MD5算法是一种非对称算法,即无法通过密文(加密后的数据)得到相应的明文(原始数据),它通过数学原理,将任意长度的字符串,变换成一个128位的整数,因此在签名和校验领域用途广泛。

正文

Java代码实现

既然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);
        }

    }

测试结果

现在我们利用写的工具类来测试一下吧!!!

公开工具类DigestUtils

是不是觉得太麻烦了? 接着看DigestUtils工具类的使用

总结

MD5总结下来有以下四个特点: 压缩性、容易计算、抗修改性、强抗碰撞。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿杰笔记

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值