import org.apache.commons.codec.DecoderException; import org.apache.commons.codec.binary.Hex; import org.apache.commons.codec.digest.HmacAlgorithms; import org.apache.commons.codec.digest.HmacUtils; import javax.crypto.KeyGenerator; import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.Objects; public /** * MAC 算法测试 */ class MacTest { public static void main(String[] args) throws NoSuchAlgorithmException, DecoderException, InvalidKeyException { // 待加密字符 String originalStr = "yaochunhui123456"; System.out.println(String.format("待加密字符: %s", originalStr)); // 已加密字符 String alreadyDigestStr = "7720C2EEFE4F1037B006025ECECBEF49"; System.out.println(String.format("已加密字符: %s", alreadyDigestStr)); /* jdk 实现 */ // 初始化 KeyGenerator, jdk 提供 HmacMD5、HmacSHA1、HmacSHA256、HmacSHA384和 HmacSHA512 四种算法 // KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5"); // 产生密钥 // SecretKey secretKey = keyGenerator.generateKey(); // 默认密钥 // byte[] defaultKey = secretKey.getEncoded(); // 自定义密钥 byte[] myKey = Hex.decodeHex(new char[]{'b','b','b','b','b','b','b','b','b','b'}); // 还原密钥 SecretKey restoreSecretKey = new SecretKeySpec(myKey, "HmacMD5"); // 实例化 MAC Mac mac = Mac.getInstance(restoreSecretKey.getAlgorithm()); // 初始化 MAC mac.init(restoreSecretKey); //执行摘要 byte[] hmacMD5Bytes = mac.doFinal(originalStr.getBytes()); String encodeHexString = Hex.encodeHexString(hmacMD5Bytes).toUpperCase(); System.out.println(String.format("%s 加密结果:%s", originalStr, encodeHexString)); System.out.println(String.format("验证结果:%b", Objects.equals(encodeHexString, alreadyDigestStr))); /* apache 实现 */ // HmacMD5 HmacUtils hmacMd5 = new HmacUtils(HmacAlgorithms.HMAC_MD5, myKey); String apacheHmacMd5 = hmacMd5.hmacHex(originalStr.getBytes()).toUpperCase(); System.out.println(String.format("%s 加密结果:%s", originalStr, apacheHmacMd5)); System.out.println(String.format("验证结果:%b", Objects.equals(apacheHmacMd5, alreadyDigestStr))); // HmacSHA1 HmacUtils hmacSha1 = new HmacUtils(HmacAlgorithms.HMAC_SHA_1, KeyGenerator.getInstance(HmacAlgorithms.HMAC_SHA_1.getName()).generateKey().getEncoded()); String apacheHmacHex1 = hmacSha1.hmacHex(originalStr.getBytes()).toUpperCase(); System.out.println(String.format("%s 加密结果:%s", originalStr, apacheHmacHex1)); // HmacSHA256 HmacUtils hmacSha256 = new HmacUtils(HmacAlgorithms.HMAC_SHA_256, KeyGenerator.getInstance(HmacAlgorithms.HMAC_SHA_256.getName()).generateKey().getEncoded()); String apacheHmacSha256 = hmacSha256.hmacHex(originalStr.getBytes()).toUpperCase(); System.out.println(String.format("%s 加密结果:%s", originalStr, apacheHmacSha256)); // HmacSHA384 , 类似上面 // HmacSHA512, 类似上面 } }