• MessageDigest消息摘要


    <1>MessageDigest基础

      MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。

      MessageDigest 对象开始被初始化。该对象通过使用 update()方法处理数据。任何时候都可以调用 reset()方法重置摘要。一旦所有需要更新的数据都已经被更新了,应该调用digest() 方法之一完成哈希计算。

      对于给定数量的更新数据,digest 方法只能被调用一次。在调用 digest 之后,MessageDigest 对象被重新设置成其初始状态。

      

    1、public static MessageDigest getInstance(String algorithm) throws NoSuchAlgorithmException
       返回实现指定摘要算法的 MessageDigest 对象。
         algorithm - 所请求算法的名称

    2、public static MessageDigest getInstance(String algorithm,String provider)throws NoSuchAlgorithmException,NoSuchProviderException
      返回实现指定摘要算法的 MessageDigest 对象。
        algorithm - 所请求算法的名称
        provider - 提供者的名称。

    3、public void update(byte[] input)
      使用指定的 byte 数组更新摘要。 

    4、public byte[] digest()
      通过执行诸如填充之类的最终操作完成哈希计算。在调用此方法之后,摘要被重置。

    5、public static boolean isEqual(byte[] digesta, byte[] digestb)
    比较两个摘要的相等性。做简单的字节比较。

    注意:Provider可以通过 Java.security.Security.getProviders() 方法获取已注册提供者列表。比较常用的有“SUN”

    SUN提供的常用的算法名称有:

              MD2
              MD5
                            SHA-1
                            SHA-256
                            SHA-384
                            SHA-512

    举例说明:

      /**
         * 将一个字符串进行MD5算法,获取摘要
         * @param str
         * @return
         */
        public static String md5Hex(String str){
            byte[] data = str.getBytes();
            try {
                //获取指定算法的MessageDigest对象
                MessageDigest digest = MessageDigest.getInstance("MD5");
                //更新摘要
                digest.update(data);
                //获取经过摘要算法后的摘要字节数组
                byte[] messageDigest = digest.digest();
                StringBuffer hexString = new StringBuffer();
                //将经摘要算法的字节数组装换成十六进制的字符串
                for(byte b : messageDigest){
                    String hex = Integer.toHexString(b & 0xff);
                    if(hex.length()<2){ //长度小于2,转换时需加上一个0,构成两位格式
                        hexString.append(0);
                    }
                    hexString.append(hex);
                }
                return hexString.toString();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
            return "";
        }

    <二> MessageDigest高级应用

    (1)MessageDigest对文件进行摘要计算

      /**
         * 获取文件信息摘要计算
         * @param in
         * @return
         * @throws IOException
         * @throws NoSuchAlgorithmException
         */
        public static String fileResume(InputStream in) throws IOException, NoSuchAlgorithmException{
            MessageDigest digest = MessageDigest.getInstance("MD5");
            
            byte[] buf = new byte[1024];
            int len = 0;
            while((len = in.read(buf))!=-1){
                //每次更新缓冲中的字节摘要
                digest.update(buf,0,len);
            }
            byte[] data = digest.digest();
            //获取经过摘要算法后的摘要字节数组
            byte[] messageDigest = digest.digest();
            StringBuffer hexString = new StringBuffer();
            //将经摘要算法的字节数组装换成十六进制的字符串
            for(byte b : messageDigest){
                String hex = Integer.toHexString(b & 0xff);
                if(hex.length()<2){ //长度小于2,转换时需加上一个0,构成两位格式
                    hexString.append(0);
                }
                hexString.append(hex);
            }
            return hexString.toString();
        }

    (2)第三方jar包

      commons-codec 提供了便捷的MD5工具类, 可以简化消息摘要计算:

      引入jar包后,直接调用

        DigestUtil.DigestUtils.md5Hex(String str)  获取字符串的MD5信息摘要

        DigestUtils.sha1Hex(String str)  获取字符串的SHA-1信息摘要

        DigestUtils.md5Hex(InputStream in) 获取输入流的MD5信息摘要

    <三>MD5原理

  • 相关阅读:
    Ansible-Tower--安装配置及破解
    Ansible-playbook--配置及使用
    Ansible-基础配置及常用模块
    基于SLB实现滚动发布
    CentOS7 部署yapi API 文档管理工具
    node及pm2环境安装
    MySQL参数max_connect_errors分析
    CentOS7搭建confluence企业级文档管理
    Gitlab用户密码忘记如何修改
    Docker私有仓库Harbor介绍与部署
  • 原文地址:https://www.cnblogs.com/gangbalei/p/6249545.html
Copyright © 2020-2023  润新知