Java HmacSHA256 加解密实现

概述

在本篇文章中,我将教会你如何在Java中使用HmacSHA256算法进行加密和解密。HmacSHA256是一种基于哈希函数的消息认证码算法,它可以用于验证数据的完整性和真实性。

流程

在开始之前,让我们先来看一下整个实现过程的流程:

gantt
    dateFormat  YYYY-MM-DD
    title Java HmacSHA256 加解密实现流程

    section 生成密钥
    生成密钥对        :done, 2021-10-01, 2d

    section 加密
    获取待加密的数据     :done, 2021-10-03, 1d
    执行加密操作         :done, 2021-10-04, 1d
    输出加密结果         :done, 2021-10-05, 1d

    section 解密
    获取待解密的数据     :done, 2021-10-06, 1d
    执行解密操作         :done, 2021-10-07, 1d
    输出解密结果         :done, 2021-10-08, 1d

    section 完成
    完成并测试代码        :done, 2021-10-09, 2d

生成密钥

首先,我们需要生成一个密钥对,用于加密和解密操作。在Java中,可以使用javax.crypto.KeyGenerator类来生成密钥。

import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.NoSuchAlgorithmException;

public class HmacSHA256Example {

    public static SecretKey generateKey() throws NoSuchAlgorithmException {
        KeyGenerator keyGen = KeyGenerator.getInstance("HmacSHA256");
        return keyGen.generateKey();
    }

    public static void main(String[] args) throws NoSuchAlgorithmException {
        SecretKey key = generateKey();
        System.out.println("生成的密钥:" + key);
    }
}

在上面的代码中,我们使用了KeyGenerator类来生成一个名为"HmacSHA256"的密钥。generateKey方法返回一个SecretKey对象,它表示生成的密钥。我们可以打印出密钥的字符串表示形式以供后续使用。

加密

在加密过程中,我们需要获取待加密的数据,然后使用密钥来执行加密操作。

import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

public class HmacSHA256Example {

    public static byte[] encrypt(String data, SecretKey key) throws NoSuchAlgorithmException, InvalidKeyException {
        Mac mac = Mac.getInstance("HmacSHA256");
        mac.init(key);
        return mac.doFinal(data.getBytes(StandardCharsets.UTF_8));
    }

    public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException {
        SecretKey key = generateKey();
        String data = "Hello, World!";
        byte[] encryptedData = encrypt(data, key);
        System.out.println("加密结果:" + new String(encryptedData, StandardCharsets.UTF_8));
    }
}

在上面的代码中,我们使用了Mac类来执行HmacSHA256加密操作。首先,我们通过Mac.getInstance方法获取一个名为"HmacSHA256"的Mac实例,然后使用密钥来初始化该实例。接下来,我们调用doFinal方法来执行实际的加密操作,将待加密的数据作为参数传递给该方法。最后,我们打印出加密结果。

解密

在解密过程中,我们需要获取待解密的数据,然后使用密钥来执行解密操作。

import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

public class HmacSHA256Example {

    public static byte[] decrypt(byte[] encryptedData, SecretKey key) throws NoSuchAlgorithmException, InvalidKeyException {
        Mac mac = Mac.getInstance("HmacSHA256");
        mac.init(key);
        return mac.doFinal(encryptedData);
    }

    public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException {
        SecretKey key = generateKey();
        String data = "Hello, World!";
        byte[] encryptedData = encrypt(data, key);
        byte[] decryptedData = decrypt(encryptedData, key);
        System.out.println("解密结果:" + new String(decryptedData, Standard