Java 根据字符串生成token并还原
1. 简介
在开发中,我们经常会遇到需要生成token的场景,比如用户认证、接口调用等。本文将教你如何使用Java生成token,并且可以根据token还原出原始字符串。
2. 整体流程
下面是生成token并还原的整体流程,我们可以使用表格展示步骤。
步骤 | 描述 |
---|---|
1 | 生成随机密钥 |
2 | 使用密钥对原始字符串进行加密 |
3 | 将加密后的字符串转换为token |
4 | 根据token还原出原始字符串 |
3. 详细步骤及代码实现
3.1 生成随机密钥
在生成token之前,我们需要先生成一个随机的密钥。密钥的长度可以根据需要进行调整,一般推荐使用128位或256位的密钥。
import java.security.SecureRandom;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
public class TokenGenerator {
public static SecretKey generateKey() throws Exception {
// 使用AES算法生成密钥
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = new SecureRandom();
keyGenerator.init(secureRandom);
// 生成密钥
SecretKey secretKey = keyGenerator.generateKey();
return secretKey;
}
}
上述代码通过Java的KeyGenerator
类生成了一个AES算法的密钥,并返回生成的密钥。
3.2 使用密钥对原始字符串进行加密
在生成了密钥之后,我们可以使用该密钥对原始字符串进行加密。下面是加密的代码示例:
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class TokenGenerator {
// 省略 generateKey() 方法
public static String encrypt(String strToEncrypt, SecretKey secretKey) throws Exception {
// 创建Cipher对象,指定算法为AES
Cipher cipher = Cipher.getInstance("AES");
// 使用密钥初始化Cipher对象,指定为加密模式
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
// 加密字符串
byte[] encryptedBytes = cipher.doFinal(strToEncrypt.getBytes());
// 将加密后的字节数组转换为Base64编码字符串
String encryptedString = Base64.getEncoder().encodeToString(encryptedBytes);
return encryptedString;
}
}
上述代码中,我们使用了Java的Cipher
类进行加密操作。首先,创建了一个指定为AES算法的Cipher对象,并使用密钥进行初始化。然后,将原始字符串转换为字节数组,通过doFinal()
方法进行加密,最后将加密后的字节数组转换为Base64编码字符串。
3.3 将加密后的字符串转换为token
在加密了原始字符串之后,我们需要将加密后的字符串转换为token,以便在需要的地方使用。下面是将加密后的字符串转换为token的代码示例:
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
public class TokenGenerator {
// 省略 generateKey() 方法和 encrypt() 方法
public static String generateToken(String encryptedString) throws NoSuchAlgorithmException {
// 计算字符串的MD5摘要
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] hashBytes = md.digest(encryptedString.getBytes(StandardCharsets.UTF_8));
// 将摘要字节数组转换为Base64编码字符串
String token = Base64.getEncoder().encodeToString(hashBytes);
return token;
}
}
上述代码中,我们使用了Java的MessageDigest
类计算了加密后字符串的MD5摘要,并将摘要字节数组转换为Base64编码字符串作为token。
3.4 根据token还原出原始字符串
如果我们需要根据token还原出原始字符串,可以使用以下代码:
import java.util.Base64;
import java.security.MessageDigest;
import java.nio.charset.StandardCharsets;
public class TokenGenerator {
// 省略 generateKey() 方法和 encrypt() 方法
public static String decrypt(String token, SecretKey secretKey) throws Exception {
// 将