Java实现常用加密算法 —— HMAC

系列文章目录

汇总:Java实现常用加密算法汇总(建议收藏)

第一章:Java实现常用加密算法 —— MD5

第二章:Java实现常用加密算法 —— SHA256

第三章:Java实现常用加密算法 —— SM3


文章目录


前言

       本篇主要介绍HMAC算法在Java(JDK1.8)中如何实现,借助Java标准库或第三方库,非原始实现,较为基础。


一、HMAC是什么

       HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code)的缩写,由H.Krawezyk,M.Bellare,R.Canetti于1996年提出的一种基于Hash函数和密钥进行消息认证的方法,并于1997年作为RFC2104被公布,并在IPSec和其他网络协议(如SSL)中得以广泛应用,现在已经成为事实上的Internet安全标准。它可以与任何迭代散列函数捆绑使用。

—— 百度百科

二、实现方式

HMAC算法是基于哈希函数的,因此可以和常用的哈希加密算法MD5、SHA256、SM3进行组合。

1、HAMC-MD5

代码如下(示例):

public class EncryptUtils {
    /**
     * HMAC-MD5,Hash-based Message Authentication Code,是一种基于哈希函数和密钥的消息认证码算法,用于确保消息的完整性和认证。
     * <p>
     * 输入:待加密的字符串
     * 输出:与MD5一致
     * 应用:密码管理、数字签名、文件完整性校验
     * 安全性:★★☆☆☆
     *
     * @param plainString 明文
     * @param key         秘钥
     * @return cipherString 密文
     */
    public static String hmacMD5(String plainString, String key) {
        String cipherString = null;
        try {
            // 指定算法
            String algorithm = "HmacMD5";
            // 创建密钥规范
            SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), algorithm);
            // 获取Mac对象实例
            Mac mac = Mac.getInstance(algorithm);
            // 初始化mac
            mac.init(secretKeySpec);
            // 计算mac
            byte[] macBytes = mac.doFinal(plainString.getBytes(StandardCharsets.UTF_8));
            // 输出为16进制字符串
            StringBuilder sb = new StringBuilder();
            for (byte b : macBytes) {
                sb.append(String.format("%02x", b));
            }
            cipherString = sb.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return cipherString;
    }
}

2、HMAC-SHA256

代码如下(示例):

public class EncryptUtils {
    /**
     * HMAC-SHA256,Hash-based Message Authentication Code,是一种基于哈希函数和密钥的消息认证码算法,用于确保消息的完整性和认证。
     * <p>
     * 输入:待加密的字符串
     * 输出:与SHA256一致
     * 应用:密码管理、数字签名、文件完整性校验
     * 安全性:★★★☆☆
     *
     * @param plainString 明文
     * @param key         秘钥
     * @return cipherString 密文
     */
    public static String hmacSHA256(String plainString, String key) {
        String cipherString = null;
        try {
            // 指定算法
            String algorithm = "HmacSHA256";
            // 创建密钥规范
            SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), algorithm);
            // 获取Mac对象实例
            Mac mac = Mac.getInstance(algorithm);
            // 初始化mac
            mac.init(secretKeySpec);
            // 计算mac
            byte[] macBytes = mac.doFinal(plainString.getBytes(StandardCharsets.UTF_8));
            // 输出为16进制字符串
            StringBuilder sb = new StringBuilder();
            for (byte b : macBytes) {
                sb.append(String.format("%02x", b));
            }
            cipherString = sb.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return cipherString;
    }
}

3、HMAC-SM3

因Java标准库未实现SM3算法,需添加BC包为算法提供者。

代码如下(示例):

public class EncryptUtils {
    static {
        // 添加安全提供者(SM2,SM3,SM4等加密算法,CBC、CFB等加密模式,PKCS7Padding等填充方式,不在Java标准库中,由BouncyCastleProvider实现)
        Security.addProvider(new BouncyCastleProvider());
    }

    /**
     * HMAC-SM3,Hash-based Message Authentication Code,是一种基于哈希函数和密钥的消息认证码算法,用于确保消息的完整性和认证。
     * <p>
     * 输入:待加密的字符串
     * 输出:与SM3一致
     * 应用:密码管理、数字签名、文件完整性校验
     * 安全性:★★★☆☆
     *
     * @param plainString 明文
     * @param key         秘钥
     * @return cipherString 密文
     */
    public static String hmacSM3(String plainString, String key) {
        String cipherString = null;
        try {
            // 创建KeyParameter对象
            KeyParameter keyParameter = new KeyParameter(key.getBytes(StandardCharsets.UTF_8));
            // 创建HMac对象
            HMac hmac = new HMac(new SM3Digest());
            // 初始化hmac
            hmac.init(keyParameter);
            // 更新mac
            hmac.update(plainString.getBytes(StandardCharsets.UTF_8), 0, plainString.length());
            // 创建输出缓冲区
            byte[] macBytes = new byte[hmac.getMacSize()];
            // 计算mac
            hmac.doFinal(macBytes, 0);
            // 输出为16进制字符串
            StringBuilder sb = new StringBuilder();
            for (byte b : macBytes) {
                sb.append(String.format("%02x", b));
            }
            cipherString = sb.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return cipherString;
    }
}

三、测试

我在这里随机找了一个在线md5加密的某网站做对比,如下:

代码如下(示例):

public class EncryptUtils {
    ...
 
    public static void main(String[] args) {
        String plainString = "hello world, hello java!";
        String hmacMD5 = hmacMD5(plainString, "12345678");
        System.out.println("--------------------------- hmacMD5");
        System.out.println("加密前: " + plainString);
        System.out.println("加密后: " + hmacMD5);

        String hmacSHA256 = hmacSHA256(plainString, "12345678");
        System.out.println("--------------------------- hmacSHA256");
        System.out.println("加密前: " + plainString);
        System.out.println("加密后: " + hmacSHA256);

        String hmacSM3 = hmacSM3(plainString, "12345678");
        System.out.println("--------------------------- hmacSM3");
        System.out.println("加密前: " + plainString);
        System.out.println("加密后: " + hmacSM3);
    }
}

代码运行截图:

某网站运行截图


总结

       以上就是今天要讲的内容,本文仅仅简单介绍了HMAC加密算法在Java中的实现方式,各个加密算法的对比及总结请见本文系列文章汇总篇,水平有限,难免出错,仅供参考,不喜勿喷,感谢!更多内容请百度和ChatGPT!

  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值