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