From bd6dee5376a91b36803e1b797f86ac72fb49bc9d Mon Sep 17 00:00:00 2001 From: sharifi Date: Mon, 1 Nov 2021 11:01:44 +0330 Subject: [PATCH] bael-4604: add main class --- .../main/java/com/baeldung/hmac/HMACUtil.java | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 core-java-modules/core-java-security-3/src/main/java/com/baeldung/hmac/HMACUtil.java diff --git a/core-java-modules/core-java-security-3/src/main/java/com/baeldung/hmac/HMACUtil.java b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/hmac/HMACUtil.java new file mode 100644 index 0000000000..3b504d9338 --- /dev/null +++ b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/hmac/HMACUtil.java @@ -0,0 +1,68 @@ +package com.baeldung.hmac; + +import org.apache.commons.codec.digest.HmacUtils; +import org.bouncycastle.crypto.Digest; +import org.bouncycastle.crypto.digests.MD5Digest; +import org.bouncycastle.crypto.digests.SHA256Digest; +import org.bouncycastle.crypto.digests.SHA384Digest; +import org.bouncycastle.crypto.digests.SHA512Digest; +import org.bouncycastle.crypto.macs.HMac; +import org.bouncycastle.crypto.params.KeyParameter; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + + +public class HMACUtil { + + public static String hmacWithJava(String algorithm, String data, String key) + throws NoSuchAlgorithmException, InvalidKeyException { + SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), algorithm); + Mac mac = Mac.getInstance(algorithm); + mac.init(secretKeySpec); + return bytesToHex(mac.doFinal(data.getBytes())); + } + + public static String hmacWithApacheCommons(String algorithm, String data, String key) { + String hmac = new HmacUtils(algorithm, key).hmacHex(data); + return hmac; + } + + public static String hmacWithBouncyCastle(String algorithm, String data, String key) { + Digest digest = getHashDigest(algorithm); + HMac hMac = new HMac(digest); + hMac.init(new KeyParameter(key.getBytes())); + byte[] hmacIn = data.getBytes(); + hMac.update(hmacIn, 0, hmacIn.length); + byte[] hmacOut = new byte[hMac.getMacSize()]; + hMac.doFinal(hmacOut, 0); + return bytesToHex(hmacOut); + } + + private static Digest getHashDigest(String algorithm) { + switch (algorithm) { + case "HmacMD5": + return new MD5Digest(); + case "HmacSHA256": + return new SHA256Digest(); + case "HmacSHA384": + return new SHA384Digest(); + case "HmacSHA512": + return new SHA512Digest(); + } + return new SHA256Digest(); + } + + public static String bytesToHex(byte[] hash) { + StringBuilder hexString = new StringBuilder(2 * hash.length); + for (byte h : hash) { + String hex = Integer.toHexString(0xff & h); + if (hex.length() == 1) + hexString.append('0'); + hexString.append(hex); + } + return hexString.toString(); + } +}