java实现hmacsha256加解密
时间: 2024-09-03 22:00:51 浏览: 58
在Java中,HMAC (Hash-256算法是一种常见的用于验证消息完整性和防止篡改的方式。以下是使用`javax.crypto`包中的`Mac`和`SecretKeySpec`类来实现HMAC-SHA256加密和解密的基本步骤:
### 加密
```java
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.util.Base64;
public String hmacSha256Encrypt(String secretKey, String data) {
try {
SecretKeySpec key = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(key);
byte[] hash = mac.doFinal(data.getBytes());
return Base64.getEncoder().encodeToString(hash);
} catch (Exception e) {
throw new RuntimeException("Error in HMAC-SHA256 encryption", e);
}
}
```
### 解密
```java
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.util.Arrays;
import java.util.Base64;
public String hmacSha256Decrypt(String secretKey, String encryptedData) {
try {
SecretKeySpec key = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(key);
byte[] decodedHash = Base64.getDecoder().decode(encryptedData);
byte[] calculatedHash = mac.doFinal(data.getBytes()); // 这里的data应该是实际要比较的数据,不是加密时使用的原始数据
if (!Arrays.equals(decodedHash, calculatedHash)) {
throw new InvalidKeyException("Invalid HMAC");
}
// 如果到这里都没有异常,说明解密成功,但通常不需要返回明文,因为HMAC是用来验证的
return null; // 返回空字符串表示仅验证,不提供明文
} catch (Exception e) {
throw new RuntimeException("Error in HMAC-SHA256 decryption", e);
}
}
```
阅读全文