文章目录

  • 1、MD5加密实现代码
  • 2、MD5加密特性
  • 其他


1、MD5加密实现代码

package com.atguigu.utils.utils;

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


public final class MD5 {

    public static String encrypt(String strSrc) {
        try {
            char hexChars[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
                    '9', 'a', 'b', 'c', 'd', 'e', 'f' };            // 用于输出编码的类型
            byte[] bytes = strSrc.getBytes();               // 字符串转化为 byte类型,一个字符转化为一个byte,比如 0为48,1为49,ascll码
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(bytes);        // 用指定的 byte 数组更新摘要
            bytes = md.digest();     // 通过执行诸如填充之类的最终操作完成哈希计算。在调用此方法之后,摘要被重置,得到固定长度为16的 bytes数组
            int len = bytes.length;  // 得到长度
            char[] chars = new char[len * 2];       //初始化字符数组容量,chars用于存储加密的内容,乘二是因为下面的处理,一个
            int k = 0;
            for (int i = 0; i < bytes.length; i++) {
                byte b = bytes[i];                          // byte类型表示-128~127的整数
                chars[k++] = hexChars[b >>> 4 & 0xf];       // >>>表示无符号右移,oxf表示1111,hexChars为上面写的数组,hexChars的长度为16,经过 & 0xf 运算取最低4位得出下标位置取出字符串
                chars[k++] = hexChars[b & 0xf];
            }
            return new String(chars);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            throw new RuntimeException("MD5加密出错!!+" + e);
        }
    }

    public static void main(String[] args) {
        System.out.println(MD5.encrypt("111111"));
        System.out.println(MD5.encrypt("1111"));      
    }
}
  • 上面整个代码的执行流程就是,通过MessageDigest工具得到16位bytes的密文,再把每个密文经过两种运算方式,运算出来的结果当做数组下标从自己设定的hexChars字符数组中取出字符,得出最后加密的密文。
  • 一个密文经过两次运算,每次运算出来的结果当作数组下标取值,所以一个密文,取两次,这就是为什么16长度的bytes数组最后会得到32长度的字符串
  • MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。
  • java中MessageDigest已经定义了MD5的计算,得到的结果是128位整数(一个byte是8个整数,所以程序中为16位byte)。然后将得到的128位整数转换成16进制(两个16进制等于1个byte),用字符串的形式输出。

2、MD5加密特性

  • 固定长度,任意数据得到的密文长度都相同
  • md5是单向加密的加密算法
  • 相同的明文在任意时间加密,得到的加密结果是相同的
  • MD5消息摘要算法,属Hash算法一类。

其他

  1. 什么是hash算法
    哈希算法,即 hash,又叫散列算法,是一类把任意数据转换为定长(或限制长度)数据的算法统称。例如我叫张三,你叫李四,那么「人 -> 人名」的算法就叫属于一种哈希算法。哈希算法通常用于制作数字指纹,数字指纹的意思就是「你看到这个东西就像看到原数据一样」,例如我们在一些网站下载大文件的时候,网站提供给我们验证文件完整性的 MD5 或者 SHA1 码,就是原文件的哈希值。哈希算法有很多种,MD5 是其中的一种,这就是 MD5。所以,优秀的哈希算法通常需要具有低碰撞概率(即不同数据的哈希值通常也不一样)。

参考文档:

  • MessageDigest的功能及用法
  • MD5加密概述,原理及实现