MD5 加密

  MD5长度

有人说md5,128位,32位,16位,到底md5多长?

md5的长度,默认为128bit,也就是128个0和1的二进制串。

这样表达是很不友好的。

所以将二进制转成了16进制,每4个bit表示一个16进制,

所以128/4 = 32 换成16进制表示后,为32位了。

 

为什么网上还有md5是16位的呢?

网上有很多帖子,md5 32位 16位 加密 区别。

仔细观察admin生成的32位和16位的md5值……

看出来了吧!

其实16位的长度,是从32位md5值来的。是将32位md5去掉前八位,去掉后八位得到的。

查询结果:

md5(admin,32) = 21232f297a57a5a743894a0e4a801fc3

md5(admin,16) = 7a57a5a743894a0e

 

Java语言中生成MD5的值 特点

public class MD5Test {
 
    //main测试类
    public static void main(String[] args) {
        String result = getMD5("aaa");
        System.err.println(result);
    }
 
    /**
     * 生成md5
     * @param message
     * @return
     */
    public static String getMD5(String message) {
        String md5str = "";
        try {
            //1 创建一个提供信息摘要算法的对象,初始化为md5算法对象
            MessageDigest md = MessageDigest.getInstance("MD5");
 
            //2 将消息变成byte数组
            byte[] input = message.getBytes();
 
            //3 计算后获得字节数组,这就是那128位了
            byte[] buff = md.digest(input);
 
            //4 把数组每一字节(一个字节占八位)换成16进制连成md5字符串
            md5str = bytesToHex(buff);
 
        } catch (Exception e) {
            e.printStackTrace();
        }
        return md5str;
    }
 
    /**
     * 二进制转十六进制
     * @param bytes
     * @return
     */
    public static String bytesToHex(byte[] bytes) {
        StringBuffer md5str = new StringBuffer();
        //把数组每一字节换成16进制连成md5字符串
        int digital;
        for (int i = 0; i < bytes.length; i++) {
             digital = bytes[i];
 
            if(digital < 0) {
                digital += 256;
            }
            if(digital < 16){
                md5str.append("0");
            }
            md5str.append(Integer.toHexString(digital));
        }
        return md5str.toString().toUpperCase();
    }

  public static String makeSignMD5_32(String data, String appkey) throws Exception{
    StringBuilder localStringBuilder = new StringBuilder();
    BASE64Encoder base64en = new BASE64Encoder();
    MessageDigest localMessageDigest = MessageDigest.getInstance("MD5");
    byte[] arrayOfByte = localMessageDigest.digest((data+appkey).getBytes("utf-8"));
    for (int i = 0; i < arrayOfByte.length; i++)
    {
      String k = Integer.toHexString(arrayOfByte[i] & 0xFF);
      if (k.length() == 1) {
        localStringBuilder.append("0");
      }
      localStringBuilder.append(k);
    }
    String Ret= base64en.encode(localStringBuilder.toString().getBytes());
    return Ret;

  }



}

  

加密字符串

逻辑思维:

  • 1.获取信息摘要对象:md5

    通过信息摘要单例的构造函数获取:

    ​MessageDigest md5 = MessageDigest.getInstance("MD5");
    
  • 2.信息摘要对象是对字节数组进行摘要的,所以先获取字符串的字节数组.

    byte[] bytes = str.getBytes();​
  • 3.信息摘要对象对字节数组进行摘要,得到摘要字节数组:

    byte[] digest = md5.digest(bytes);​
  • 4.把摘要数组中的每一个字节转换成16进制,并拼在一起就得到了MD5值.
    (PS,有些转换过来得到的是前面有6个f的情况,如:ffffff82,这是因为前面有6组4个1,所以提前把这6组1111先变成0就好了,然后再转16进制就没有f了)
    (其实也可以在后面续把f去掉)

 

posted @ 2020-10-30 10:15  不会游泳的鱼~~  阅读(387)  评论(0编辑  收藏  举报