Java经典Hash算法之MD5加密

一、简单介绍  

  因为加密要对应解密,而MD5是不可逆的,所以,严格来说,MD5不是加密算法,而是一种hash算法,准确的应该叫信息摘要算法。

  Hash算法特别的地方在于它是一种单向算法,用户可以通过Hash算法对目标信息生成一段特定长度的唯一的Hash值,却不能通过这个Hash值重新获得目标信息。因此Hash算法常用在不可还原的密码存储、信息完整性校验等。

  下文中将进行MD5加密的文件(字符串、文件等)称为明文,MD5加密结果称为密文。

 

二、代码实现

 

package com.xiaodajia.modules.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Util {

    /**
    * 定义char数组,16进制对应的基本字符
    */
    private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd',
        'e', 'f' };

    /**
    * md5加密
    * @param str 需要加密的数据
    * @return 加密结果
    * @author sucb
    * @date 2017年7月26日下午5:12:16
    */
    public static String getMD5String(String str) {
        MessageDigest messageDigest = null;
        try {
            messageDigest = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }
        messageDigest.update(str.getBytes());
        return byteArray2HexString(messageDigest.digest());
    }

    /**
    * MD5加密结果(由byte转换成String)
    * @param bytes md5加密后得到的数组
    * @return md5加密结果
    * @author sucb
    * @date 2017年7月26日下午5:12:09
    */
    private static String byteArray2HexString(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(HEX_DIGITS[(b & 0xf0) >> 4]).append(HEX_DIGITS[(b & 0x0f)]);
        }
        return sb.toString();
    }

    /**
    * 测试方法
    * @param args
    * @author sucb
    * @date 2017年7月26日下午5:11:50
    */
    public static void main(String[] args) {
        System.out.println(getMD5String("123456"));
    }
}

 

三、应用场景  

 1)、密码加密

  MD5的不可逆,所以很多网站会把密码转换MD5再存储。 这样就算别人获得数据库的用户资料,也没有办法获知密码。加密规则可以由你自己确定,比如:你可以用MD5(MD5(用户名) + MD5(密码))来存储密码。

 2)、拦截请求

  在请求中加入某个密文,只有请求中存在这个密文时,才允许这个请求执行业务逻辑,没有这个密文的请求会被拦截下来。

 3)、文件完整校验

  一个文件,经过MD5加密后只会产生一个密文,如果文件遭到病毒破坏或者人为修改,密文就会不一样,这样我们就知道文件已经被修改了。 

  从上面应用场景可以知道,MD5其实是进行身份校验。

四、安全性

 关于安全性,我查了点资料,大概是这样的。  

  1)、MD5的输出为128位,若采用纯强力攻击寻找一个消息具有给定Hash值的计算困难性为2^128,用每秒可试验1000000000个消息的计算机需时1.07×10^22年。若采用生日攻击法,寻找有相同Hash值的两个消息需要试验2^64个消息,用每秒可试验1000000000个消息的计算机需时585年。

  2)、MD5加密是一种hash算法,输入任意一段明文,得到一个定长的唯一的密文(Hash值)。密文个数是一定的,明文个数为无穷多,MD5是一个无穷多对一的映射,多对一的函数是不可逆的。使用快速产生碰撞的算法,可以找到一个密文对应的明文来欺骗密码校验(注:该明文不一定是原来的明文)。

  3)、要解密MD5没有现成的算法,可以用穷举法,把可能出现的明文,用MD5算法散列之后,把得到的散列值和原始的数据形成一个一对一的映射表,通过比在表中比破解密码的MD5算法散列值,通过匹配从映射表中找出破解密码所对应的原始明文。

  4)、关于MD5的破解

  2004年,王小云教授提出了非常高效的MD5碰撞方法。

  2009年,冯登国、谢涛利用差分攻击,将MD5的碰撞算法复杂度进一步降低。

解密的代价远远大于解密带来的收益,就可以认为它是安全的。所以目前来说,MD5加密是比较安全的。

【MD5反向查询】

 

 

如果有写的不对的地方,请大家多多批评指正,非常感谢!

你可能感兴趣的:(加解密)