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 {
        // 将