admin
2022-04-07 211840b64fa1132d76d6dff6c779e9ba2c0c450f
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
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;
 
    }
}