package util;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import org.apache.commons.lang3.StringUtils;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
/**
* @author: sk
* @date: 2020/8/10
* @des: 对userName通过AES加密,附带有效期。
*/
public class AESUtil {
//秘钥随机密码
private static String pwd = "aaa";
//密文有效期10分钟
private static Integer validity = 10;
/**
*@描述 :加密
*@参数
*@返回值
*@创建人 sk
*@创建时间 2020/8/10
*@修改人和其它信息
*/
public static String encrypt(String content) {
byte[] result = null;
try {
if (StringUtils.isEmpty(content)){
return null;
}
//获取一个秘钥生成器
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
random.setSeed(pwd.getBytes());
//初始化128位key
kgen.init(128, random);
//生产一个秘钥
SecretKey secretKey = kgen.generateKey();
//返回基本编码格式秘钥,如果秘钥不支持编码则返回为空!
byte[] enCodeFormat = secretKey.getEncoded();
//转换为AES专用秘钥
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
//创建密码器
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
//初始化为加密模式密码器
cipher.init(Cipher.ENCRYPT_MODE, key);
/**时间戳放入明文在解密时验证密文是否在有效期内**/
content = System.currentTimeMillis()+"@" + content;
byte[] byteContent = content.getBytes();
//加密
result = cipher.doFinal(byteContent);
} catch (Exception e) {
return null;
}
//返回base64编码密文
return new String(Base64.encode(result));
}
/**
*@描述 :解密
*@参数
*@返回值
*@创建人 sk
*@创建时间 2020/8/10
*@修改人和其它信息
*/
public static String decrypt(String content) {
byte[] result = null;
byte[] bytes = Base64.decode(content);
try {
//获取一个秘钥生成器
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
random.setSeed(pwd.getBytes());
//初始化为128位key
kgen.init(128, random);
//生成一个秘钥
SecretKey secretKey = kgen.generateKey();
//生成一个基本编码格式秘钥
byte[] enCodeFormat = secretKey.getEncoded();
//转换为AES专用秘钥
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
//创建密码器
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
//初始化为加密模式密码器
cipher.init(Cipher.DECRYPT_MODE, key);
//解密
result = cipher.doFinal(bytes);
} catch (Exception e) {
return null;
}
String plaintext = new String(result);
String[] split = plaintext.split("@");
//计算有效期
boolean b = (System.currentTimeMillis() - Long.parseLong(split[0])) / (1000 * 60) <= validity;
//有效期内,返回明文
if (b){
return split[1];
}
//密文失效,返回null
else {
return null;
}
}
public static void main(String[] args) throws InterruptedException {
// String content = "123654哈哈";
// System.out.println("加密前=" + content);
// String encrypt = AESUtil.encrypt(content);
// System.out.println("加密后=" + encrypt);
// Thread.sleep(200000);
String decrypt = AESUtil.decrypt("e/4cLTX722PgxXkHG30s5OedHOi44UGOqkC6ei3eWuc=");
System.out.println("解密后=" + decrypt);
}
}