美文网首页
java hmac-sha1 hmac-sha256

java hmac-sha1 hmac-sha256

作者: 饱饱抓住了灵感 | 来源:发表于2022-11-08 20:34 被阅读0次
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;


/**
 * This class consists of utility method for encoding based on HmacSHA1 algorithm
 */
public class HmacDigestUtil {

    /**
     * Returns an encoded string based on HmacSHA1 algorithm
     * @param key Key used to encode the data
     * @param data The data to be encoded
     * @return an encoded string
     */
    public static String signHmacSHA1(String key, String data) throws Exception {
        byte[] signData = signHmacSHA1(key.getBytes(StandardCharsets.UTF_8), data.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(signData);
    }

    /**
     * Initializes the encoder and returns the encoded byte array
     * @param key Key used to encode the data
     * @param data The data to be encoded
     * @return an encoded byte array
     */
    private static byte[] signHmacSHA1(byte[] key, byte[] data) throws Exception {
        Mac mac = Mac.getInstance("HmacSHA1");
        mac.init(new SecretKeySpec(key, "HmacSHA1"));
        return mac.doFinal(data);
    }

    /**
     * Returns the encoded string generated by HmacSHA256.
     * The output is a String of length 64.
     * (SHA256 -> 256bits -> 32 bytes -> 64 characters in hex number)
     * @param key
     * @param data
     * @return
     */
    public static String signHmacSha256ToHexString(String key, String data) throws Exception {
        byte[] signData = signHmacSha256(key.getBytes(StandardCharsets.UTF_8), data.getBytes(StandardCharsets.UTF_8));
        return toCoreUtilsString(signData);
    }

    

    /**
     * Returns the SHA256 MAC in byte array.
     *
     * @param key
     * @param data
     * @return
     */
    private static byte[] signHmacSha256(byte[] key, byte[] data) throws Exception {
        Mac mac = Mac.getInstance("HmacSHA256");
        mac.init(new SecretKeySpec(key, "HmacSHA256"));
        return mac.doFinal(data);
    }
    
    /**
     * Converts bytes to Hex Strings.
     * Example: [10100000,00000000,00010011,00100100] -> [a0,00,13,24] -> "a0001324"
     * @param binaryData
     * @return
     */
    private static String toCoreUtilsString(byte[] binaryData) {
        if (binaryData == null) return null;
        if (binaryData.length == 0) return "";
        StringBuilder result = new StringBuilder();
        for (byte b: binaryData){
            result.append(String.format("%02x", b));
        }
        return result.toString();
    }

}

相关文章

网友评论

      本文标题:java hmac-sha1 hmac-sha256

      本文链接:https://www.haomeiwen.com/subject/rlnntdtx.html