package com.ruoyi.clearwater.controller.tool;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
/**
* 用户信息加密解密
* AES对称加密解密
*
* 由于des不兼容Linux,吧des改成AES了
*
* @author Cheng Rong Yu
*/
@CrossOrigin
@Controller
public class TokenEncrypt {
public static Key setKey(String strKey) throws NoSuchAlgorithmException {
Key key = null;
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(strKey.getBytes());
try {
KeyGenerator generator = KeyGenerator.getInstance("AES");
generator.init(128,secureRandom); // 根据参数生成key
key = generator.generateKey();
} catch (Exception e) {
e.printStackTrace();
}
return key;
}
/**
* @param source 编码内容
* @param key 密钥
* @param charSet 编码格式
* @return
*/
public String encrypt(String source, String key, String charSet) {
String encrypt = null;
try {
byte[] ret = encrypt(source.getBytes(charSet), key);
encrypt = new String(Base64.getEncoder().encode(ret));
} catch (Exception e) {
e.printStackTrace();
encrypt = null;
}
/**
* 再次加密混乱密钥格式
*/
encrypt = (int)(Math.random()*(10-1+1))+"c"+encrypt+"ry"+(int)(Math.random()*(10-1+1));
return encrypt;
}
/**
* @param encryptedData 解码内容
* @param key 密钥
* @param charSet 编码格式
* @return
*/
public String decrypt(String encryptedData, String key, String charSet) {
String descryptedData = null;
System.out.println("--------------------");
System.out.println(encryptedData);
System.out.println(charSet);
System.out.println("--------------------");
try {
/**
* 解密
*/
encryptedData = encryptedData.substring(encryptedData.indexOf("c")+1,encryptedData.indexOf("ry"));
System.out.println("--------------------");
System.out.println(encryptedData);
System.out.println(charSet);
System.out.println("--------------------");
byte[] ret = descrypt(Base64.getDecoder().decode(encryptedData.getBytes()), key);
descryptedData = new String(ret, charSet);
} catch (Exception e) {
e.printStackTrace();
descryptedData = null;
}
return descryptedData;
}
private static byte[] encrypt(byte[] primaryData, String key) throws NoSuchAlgorithmException {
Key desKey = setKey(key);
try {
Cipher cipher = Cipher.getInstance("AES"); // Cipher对象实际完成加密操作
cipher.init(Cipher.ENCRYPT_MODE, desKey); // 用密钥初始化Cipher对象(加密)
return cipher.doFinal(primaryData);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private static byte[] descrypt(byte[] encryptedData, String key) throws NoSuchAlgorithmException {
Key desKey = setKey(key);
try {
System.out.println("-----------------");
System.out.println(encryptedData);
System.out.println(key);
System.out.println("-----------------");
Cipher cipher = Cipher.getInstance("AES"); // Cipher对象实际完成解密操作
cipher.init(Cipher.DECRYPT_MODE, desKey); // 用密钥初始化Cipher对象(解密)
return cipher.doFinal(encryptedData);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
登录调用
/**
* 根据登录信息生成密钥
*/
String userToken = tokenEncrypt.encrypt(username + "," + password, "加密key值,自定义即可", "utf-8");
验证token时调用
/**
* 解密token
*/
String user = tokenEncrypt.decrypt(token, "解密key值,和加密key值一致", "utf-8");
/**
* 根据英文逗号分割开字符串
*/
String[] userInfo = user.split(",");
/**
* 调用登录方法
*/
return ajaxLogin(userInfo[0], userInfo[1]);
//TODO:
**目前思路:**加密时带时间串, 2022-08-18 16:37:00
这种,同样传入token中,做登录时时间标记,然后就可以加登录过期时间,先验证时间过期,再走账号密码验证。实现token过期功能。目前代码还是没有过期功能。