admin
2021-02-06 d1f26741bddf6f512d62c0100d42c52be8d37e76
utils/src/main/java/org/yeshi/utils/encrypt/HmacUtils.java
@@ -1,101 +1,101 @@
package org.yeshi.utils.encrypt;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/**
 * hmac公用方法类
 *
 * @author weihui.tang
 *
 */
public class HmacUtils {
   public static final String CHARSET_UTF8 = "UTF-8";
   public static final String KEY_MAC = "HmacMD5";
   private static final String HEXSTR = "0123456789ABCDEF";
   private static String[] binaryArray = { "0000", "0001", "0010", "0011",
         "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011",
         "1100", "1101", "1110", "1111" };
   /**
    * hmac-md5签名
    *
    * @param data
    * @param secret
    * @return
    * @throws IOException
    * @throws NoSuchAlgorithmException
    * @throws InvalidKeyException
    */
   public static byte[] encryptHMAC(String data, String secret)
         throws IOException, NoSuchAlgorithmException, InvalidKeyException {
      byte[] bytes = null;
      SecretKey secretKey = new SecretKeySpec(secret.getBytes(CHARSET_UTF8),
            KEY_MAC);
      Mac mac = Mac.getInstance(secretKey.getAlgorithm());
      mac.init(secretKey);
      bytes = mac.doFinal(data.getBytes(CHARSET_UTF8));
      return bytes;
   }
   /**
    * 将byte转化为十六进制字符串
    *
    * @param bytes
    * @return
    */
   public static String byte2hex(byte[] bytes) {
      StringBuilder sign = new StringBuilder();
      for (int i = 0; i < bytes.length; i++) {
         sign.append(String.valueOf(HEXSTR.charAt((bytes[i] & 0xF0) >> 4))); // 字节高4位
         sign.append(String.valueOf(HEXSTR.charAt(bytes[i] & 0x0F))); // 字节低4位
      }
      return sign.toString().toUpperCase();
   }
   /**
    *
    * @param hexString
    * @return 将十六进制转换为字节数组
    */
   public static byte[] hexToBinary(String hexString) {
      // hexString的长度对2取整,作为bytes的长度
      int len = hexString.length() / 2;
      byte[] bytes = new byte[len];
      for (int i = 0; i < len; i++) {
         // 右移四位得到高位
         byte high = (byte) ((HEXSTR.indexOf(hexString.charAt(2 * i))) << 4);// 字节高四位
         byte low = (byte) HEXSTR.indexOf(hexString.charAt(2 * i + 1));// 字节低四位
         bytes[i] = (byte) (high | low);// 高地位做或运算
      }
      return bytes;
   }
   /**
    *
    * @param str
    * @return 转换为二进制字符串
    */
   public static String bytes2BinaryStr(byte[] bArray) {
      String outStr = "";
      for (byte b : bArray) {
         // 高四位
         int pos = (b & 0xF0) >> 4;
         outStr += binaryArray[pos];
         // 低四位
         pos = b & 0x0F;
         outStr += binaryArray[pos];
      }
      return outStr;
   }
}
package org.yeshi.utils.encrypt;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/**
 * hmac公用方法类
 *
 * @author weihui.tang
 *
 */
public class HmacUtils {
   public static final String CHARSET_UTF8 = "UTF-8";
   public static final String KEY_MAC = "HmacMD5";
   private static final String HEXSTR = "0123456789ABCDEF";
   private static String[] binaryArray = { "0000", "0001", "0010", "0011",
         "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011",
         "1100", "1101", "1110", "1111" };
   /**
    * hmac-md5签名
    *
    * @param data
    * @param secret
    * @return
    * @throws IOException
    * @throws NoSuchAlgorithmException
    * @throws InvalidKeyException
    */
   public static byte[] encryptHMAC(String data, String secret)
         throws IOException, NoSuchAlgorithmException, InvalidKeyException {
      byte[] bytes = null;
      SecretKey secretKey = new SecretKeySpec(secret.getBytes(CHARSET_UTF8),
            KEY_MAC);
      Mac mac = Mac.getInstance(secretKey.getAlgorithm());
      mac.init(secretKey);
      bytes = mac.doFinal(data.getBytes(CHARSET_UTF8));
      return bytes;
   }
   /**
    * 将byte转化为十六进制字符串
    *
    * @param bytes
    * @return
    */
   public static String byte2hex(byte[] bytes) {
      StringBuilder sign = new StringBuilder();
      for (int i = 0; i < bytes.length; i++) {
         sign.append(String.valueOf(HEXSTR.charAt((bytes[i] & 0xF0) >> 4))); // 字节高4位
         sign.append(String.valueOf(HEXSTR.charAt(bytes[i] & 0x0F))); // 字节低4位
      }
      return sign.toString().toUpperCase();
   }
   /**
    *
    * @param hexString
    * @return 将十六进制转换为字节数组
    */
   public static byte[] hexToBinary(String hexString) {
      // hexString的长度对2取整,作为bytes的长度
      int len = hexString.length() / 2;
      byte[] bytes = new byte[len];
      for (int i = 0; i < len; i++) {
         // 右移四位得到高位
         byte high = (byte) ((HEXSTR.indexOf(hexString.charAt(2 * i))) << 4);// 字节高四位
         byte low = (byte) HEXSTR.indexOf(hexString.charAt(2 * i + 1));// 字节低四位
         bytes[i] = (byte) (high | low);// 高地位做或运算
      }
      return bytes;
   }
   /**
    *
    * @param str
    * @return 转换为二进制字符串
    */
   public static String bytes2BinaryStr(byte[] bArray) {
      String outStr = "";
      for (byte b : bArray) {
         // 高四位
         int pos = (b & 0xF0) >> 4;
         outStr += binaryArray[pos];
         // 低四位
         pos = b & 0x0F;
         outStr += binaryArray[pos];
      }
      return outStr;
   }
}