zoukankan      html  css  js  c++  java
  • MessageDigest的功能及用法(加密解密) SHA _ MD5

    MessageDigest的功能及用法(加密解密)

    MessageDigest 加密和解密2

     
    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
     
      
     
    Code举例:
     
    import java.security.*;
    public class myDigest {
      public static void main(String[] args)  {
        myDigest my=new myDigest();
        my.testDigest();
      }
      public void testDigest()
      {
       try {
         String myinfo="我的测试信息";
        //java.security.MessageDigest alg=java.security.MessageDigest.getInstance("MD5");
          java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1");
          alga.update(myinfo.getBytes());
          byte[] digesta=alga.digest();
          System.out.println("本信息摘要是:"+byte2hex(digesta));
          //通过某中方式传给其他人你的信息(myinfo)和摘要(digesta) 对方可以判断是否更改或传输正常
          java.security.MessageDigest algb=java.security.MessageDigest.getInstance("SHA-1");
          algb.update(myinfo.getBytes());
          if (algb.isEqual(digesta,algb.digest())) {
             System.out.println("信息检查正常");
           }
           else
            {
              System.out.println("摘要不相同");
             }
       }
       catch (java.security.NoSuchAlgorithmException ex) {
         System.out.println("非法摘要算法");
       }
      }
      public String byte2hex(byte[] b) //二行制转字符串
        {
         String hs="";
         String stmp="";
         for (int n=0;n<b.length;n++)
          {
           stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));
           if (stmp.length()==1) hs=hs+"0"+stmp;
           else hs=hs+stmp;
           if (n<b.length-1)  hs=hs+":";
          }
         return hs.toUpperCase();
        }
    }

      

      
     
     
    « 上一篇: js编写时间选择框
    » 下一篇: MessageDigest 加密和解密2
     
     
    ________________________________________________________________________________________________________

    Java MD5Utils

     

    Java MD5Utils 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    /**
     * <html>
     * <body>
     *  <P> Copyright 1994 JsonInternational</p>
     *  <p> All rights reserved.</p>
     *  <p> Created on 19941115</p>
     *  <p> Created by Jason</p>
     *  </body>
     * </html>
     */
    package cn.ucaner.alpaca.framework.utils.encrypt;
    import java.math.BigInteger;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
     
    import org.apache.commons.lang3.StringUtils;
     
    /**
    * @Package:cn.ucaner.alpaca.framework.utils.encrypt  
    * @ClassName:MD5Utils  
    * @Description:   <p> MD5加密工具    By Jason </p>
    * @Author: - Jason  
    * @CreatTime:2018年5月24日 下午9:40:31  
    * @Modify By:  
    * @ModifyTime:  2018年5月24日
    * @Modify marker:  
    * @version    V1.0
     */
    class MD5Utils {
        protected final static String MD5_KEY = "MD5";
         
        protected final static String SHA_KEY = "SHA1";
         
        /**
         * @param value
         * @param key
         * @return
         */
        protected static String encrypt(String value,String key) {
            try {
                // 拿到一个MD5转换器(如果想要SHA1参数换成”SHA1”)
                MessageDigest messageDigest = MessageDigest.getInstance(key);
                // 输入的字符串转换成字节数组
                byte[] inputByteArray = value.getBytes();
                // inputByteArray是输入字符串转换得到的字节数组
                messageDigest.update(inputByteArray);
                // 转换并返回结果,也是字节数组,包含16个元素
                byte[] resultByteArray = messageDigest.digest();
                // 字符数组转换成字符串返回
                return byteArrayToHex(resultByteArray);
            catch (NoSuchAlgorithmException e) {
                return null;
            }
        }
     
        /**
         * 字节数组转换为hex
         * @param byteArray
         * @return
         */
        private static String byteArrayToHex(byte[] byteArray) {
     
            // 首先初始化一个字符数组,用来存放每个16进制字符
            char[] hexDigits = { '0''1''2''3''4''5''6''7''8''9','A''B''C''D''E''F' };
            // new一个字符数组,这个就是用来组成结果字符串的(解释一下:一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方))
            char[] resultCharArray = new char[byteArray.length * 2];
            // 遍历字节数组,通过位运算(位运算效率高),转换成字符放到字符数组中去
            int index = 0;
            for (byte b : byteArray) {
                resultCharArray[index++] = hexDigits[b >>> 4 0xf];
                resultCharArray[index++] = hexDigits[b & 0xf];
            }
            // 字符数组组合成字符串返回
            return new String(resultCharArray);
        }
        /**
         * 获得16位的加密字符
         * @param str
         * @return
         * @throws NoSuchAlgorithmException
         */
        public static String getMd5String16(String str) throws NoSuchAlgorithmException {
            String md5str = getMd5String32(str).substring(8);
            return md5str.substring(0, md5str.length() - 8);
        }
     
        /**
         * 获得24位的MD5加密字符
         * @param str
         * @return
         * @throws NoSuchAlgorithmException
         */
        public static String getMd5String24(String str) throws NoSuchAlgorithmException {
     
            String md5str = getMd5String32(str).substring(4);
            return md5str.substring(0, md5str.length() - 4);
        }
     
        /**
         * 获得32位的MD5加密算法
         * @param str
         * @return
         * @throws NoSuchAlgorithmException
         */
        public static String getMd5String32(String str) throws NoSuchAlgorithmException {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(str.getBytes());
            byte b[] = md.digest();
            int i;
            StringBuffer buf = new StringBuffer();
            for (int offset = 0; offset < b.length; offset++) {
                i = b[offset];
     
                if (i < 0)
                    i += 256;
     
                if (i < 16)
                    buf.append("0");
     
                buf.append(Integer.toHexString(i));
            }
            return buf.toString();
        }
     
        /**
         * 获取MD5密码
         * @param password
         * @param salt
         * @return
         * @throws NoSuchAlgorithmException
         */
        public static String getMD5Pwd(String password, String salt) throws NoSuchAlgorithmException {
            String result = null;
            if (StringUtils.isNotBlank(salt)) {
                result = getMD5(getMD5(password) + salt);
            else {
                result = getMD5(password);
            }
            return result;
        }
     
        /**
         * 获取MD5加密数据
         * @param input
         * @return
         * @throws NoSuchAlgorithmException
         */
        public static String getMD5(String input) throws NoSuchAlgorithmException {
            String result = input;
            if (input != null) {
                MessageDigest md = MessageDigest.getInstance("MD5"); //or "SHA-1"
                md.update(input.getBytes());
                BigInteger hash = new BigInteger(1, md.digest());
                result = hash.toString(16);
                while (result.length() < 32) {//40 for SHA-1
                    result = "0" + result;
                }
            }
            return result;
        }
     
        /**
         * For test by Jason
         */
        public static void main(String[] args) {
            try {
                System.out.println(getMd5String16("Jason")); //829018f9dbd65fb8
            catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
        }
    }

      

     
    分类: JavaUtils
     
     
     
    « 上一篇: Java Base64Utils
    » 下一篇: Java 获取客服端ip地址
     
     
  • 相关阅读:
    小程序教程3
    小程序教程2
    小程序教程1
    sublime介绍常用插件和快捷键
    ionic1跨域问题
    上传文件到windows server, 导出文件到linux, 打包压缩
    windows远程管理服务winrm
    windows配置ssh服务
    前端:websocket脚本
    前端实现: 抓拍和定时弹出任务
  • 原文地址:https://www.cnblogs.com/kelelipeng/p/13298489.html
Copyright © 2011-2022 走看看