什么是MD5加密

MD5加密即Message-Digest Algorithm5,历经了MD2,MD4发展,在1991年提出。

  • 中文名:消息摘要算法第五版
  • 英文名:Message-Digest Algorithm5
  • 提出时间:1991年

基本原理

MD5就是byte值和一个int的255进行运算,得到一个int值,再将这个int值转化为十六进制的值,这样就完成了一个MD5加密。

特点

只能从明文加密为密文,不能把密文在转化为明文。加密后是不可逆性。确保明文的加密性。

MD5加密代码

通过MD5的密文进行加密。

示例代码

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

public class MD5Utils {
    public static void main(String[] args) {
        String passWord = "123456";
        StringBuilder sb = new StringBuilder();
        //获取数据摘要器
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            //将一个byte数组进行加密操作,返回的是一个加密的byte数组,二进制的哈西计算,md5加密的第一步
            byte[] digest = messageDigest.digest(passWord.getBytes());
            for (int i = 0; i < digest.length; i++) {
                int result = digest[i] & 0xff;
                //将得到的int类型的值转化为16进制的值
                String hexString = Integer.toHexString(result);
                if (hexString.length()<2){//系统会自动把0省略,所以添加0
                   sb.append("0");
                }
                sb.append(hexString);
            }
            System.out.println(sb.toString());
        } catch (NoSuchAlgorithmException e) {//找不到加密方式异常
            e.printStackTrace();
        }

    }
}

输出结果为: e10adc3949ba59abbe56e057f20f883e

防破解

上面的代码可以对123456进行加密,但是目前网上有好多破解网站,他们的破解原理就是将一些常见的MD5加密密文保存到数据库中,通过比对来达到所谓的破解。所以通过下面的方法进行加密会完全是网上

不规则加密(加盐)

通过对十六进制变量后进行不规则操作加密,在13行代码后边加数,进行不规则加密。这样会的话几乎已经无法完成破解了。

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

public class MD5Utils {
    public static void main(String[] args) {
        String passWord = "123456";
        StringBuilder sb = new StringBuilder();
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            byte[] digest = messageDigest.digest(passWord.getBytes());
            for (int i = 0; i < digest.length; i++) {
                int result = digest[i] & 0xff;
                String hexString = Integer.toHexString(result)+1;//不规则加密,俗称加盐
                if (hexString.length()<2){
                   sb.append("0");
                }
                sb.append(hexString);
            }
            System.out.println("密码为 123456\n 加密后");
            System.out.println(sb.toString());
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
}

加密结果 e11a1dc1391491ba1591ab1be1561e01571f21f18813e1

银行系统MD5加密方式

这种是银行等系统要求安全性非常高的系统,一般会对加密后的密文再次进行一次MD5加密,这样进行10-30次,达到一个无法破解的密文。

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

public class MD5Utils {
    //银行 银行卡 6位数 将密码进行十到三十次MD5加密
    public static void main(String[] args) {
        String passWord = "123456";
        StringBuilder sb = new StringBuilder();
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            for (int h = 0; h < 10; h++) { //进行多次循环加密
                byte[] digest = messageDigest.digest(passWord.getBytes());
                for (int i = 0; i < digest.length; i++) {
                    int result = digest[i] & 0xff;
                    String hexString = Integer.toHexString(result)+1;
                    if (hexString.length() < 2) {
                        sb.append("0");
                    }
                    sb.append(hexString);
                }
                passWord = sb.toString();
                sb.delete(0, sb.length());

            }
            System.out.println(passWord);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
}

加密后结果: 6912c1901801301e61951b01281ca1f21ca1dd1dc17e12a1

补充 Kotlin 版本


import java.security.MessageDigest

/**
 * md5 加密工具类用于加密密码
 * 默认没有加盐
 */

object Md5Utils {

    private const val salt: Int = 0

    fun md5(message: String): String {
        val sb = StringBuilder()
        val messageDigest = MessageDigest.getInstance("MD5")
        val digest: ByteArray = messageDigest.digest(message.toByteArray())
        for (i in 0 until digest.size) {
            val result: Int = digest[i].toInt() and (0xff)
            val hexString = Integer.toHexString(result) + salt
            if (hexString.length < 2) {
                sb.append("0")
            }
            sb.append(hexString)
        }
        return sb.toString()
    }
}