zoukankan      html  css  js  c++  java
  • 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去掉)

  • 相关阅读:
    C# 抽象方法和虚方法的区别
    xmlhttprequest readyState 属性的五种状态
    ServiceStack破解文件
    k8s部署mysql
    docker 开放2376端口的问题
    .net core 发布到IIS 没有 web.config 文件
    1064
    docker mysql 主从同步配置
    Docker 鼠标在虚拟机与主机之间自由切换
    Socket原理解析2
  • 原文地址:https://www.cnblogs.com/xiaohuizhenyoucai/p/13900755.html
Copyright © 2011-2022 走看看