RSAUtils代码
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import org.springframework.util.Base64Utils;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
public class RSAUtils {
public static final String ENCRYPT_TYPE_RSA = "RSA";
public static final String PUBLIC_KEY = "RSAPublicKey";
public static final String PRIVATE_KEY = "RSAPrivateKey";
static final Long cacheTime = 30 * 1000L;
public static Map<String, String> generateKeyPair() throws Exception {
KeyPair pair = SecureUtil.generateKeyPair(ENCRYPT_TYPE_RSA);
PrivateKey privateKey = pair.getPrivate();
PublicKey publicKey = pair.getPublic();
byte[] pubEncBytes = publicKey.getEncoded();
byte[] priEncBytes = privateKey.getEncoded();
String pubEncBase64 = Base64.getEncoder().encodeToString(pubEncBytes);
String priEncBase64 = Base64.getEncoder().encodeToString(priEncBytes);
Map<String, String> map = new HashMap<String, String>(2);
map.put(PUBLIC_KEY, pubEncBase64);
map.put(PRIVATE_KEY, priEncBase64);
ConcurrentHashMapUtil.setCache(pubEncBase64, priEncBase64, cacheTime);
return map;
}
public static String encrypt(String input, String publicKeyBase64)
throws Exception {
RSA rsa = new RSA(null, publicKeyBase64);
return rsa.encryptBase64(input, KeyType.PublicKey);
}
public static String decrypt(String input, String publicKeyBase64)
throws Exception {
RSA rsa = new RSA(ConcurrentHashMapUtil.getCache(publicKeyBase64).toString(), null);
byte[] s = rsa.decrypt(Base64Utils.decode(input.getBytes(StandardCharsets.UTF_8)), KeyType.PrivateKey);
ConcurrentHashMapUtil.deleteCache(publicKeyBase64);
return new String(s);
}
public static void main(String[] args) throws Exception {
Map<String, String> map = generateKeyPair();
String encrypt = encrypt("测试", map.get(PUBLIC_KEY));
System.out.println(encrypt);
String public_key = map.get(PUBLIC_KEY);
String private_key = map.get(PRIVATE_KEY);
System.out.println(public_key);
System.out.println(private_key);
}
}
ConcurrentHashMapUtil代码(防止获取了秘钥key不消费)
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class ConcurrentHashMapUtil {
private static Logger LOGGER = LoggerFactory.getLogger(ConcurrentHashMapUtil.class);
private static final Integer CACHE_MAX_NUMBER = 1000;
private static Integer CURRENT_SIZE = 0;
static final Long ONE_MINUTE = 30 * 60 * 1000L;
private static final Map<String, CacheObj> CACHE_OBJECT_MAP = new ConcurrentHashMap<>();
private static final List<String> CACHE_USE_LOG_LIST = new LinkedList<>();
private static volatile Boolean CLEAN_THREAD_IS_RUN = false;
public static void setCache(String cacheKey, Object cacheValue, long cacheTime) {
Long ttlTime = null;
if (cacheTime <= 0L) {
if (cacheTime == -1L) {
ttlTime = -1L;
} else {
return;
}
}
checkSize();
saveCacheUseLog(cacheKey);
CURRENT_SIZE = CURRENT_SIZE + 1;
if (ttlTime == null) {
ttlTime = System.currentTimeMillis() + cacheTime;
}
CacheObj cacheObj = new CacheObj(cacheValue, ttlTime);
CACHE_OBJECT_MAP.put(cacheKey, cacheObj);
LOGGER.info("have set key :" + cacheKey);
}
public static void setCache(String cacheKey, Object cacheValue) {
setCache(cacheKey, cacheValue, -1L);
}
public static Object getCache(String cacheKey) {
startCleanThread();
if (checkCache(cacheKey)) {
saveCacheUseLog(cacheKey);
return CACHE_OBJECT_MAP.get(cacheKey).getCacheValue();
}
return null;
}
public static boolean isExist(String cacheKey) {
return checkCache(cacheKey);
}
public static void clear() {
LOGGER.info("have clean all key !");
CACHE_OBJECT_MAP.clear();
CURRENT_SIZE = 0;
}
public static void deleteCache(String cacheKey) {
Object cacheValue = CACHE_OBJECT_MAP.remove(cacheKey);
if (cacheValue != null) {
LOGGER.info("have delete key :" + cacheKey);
CURRENT_SIZE = CURRENT_SIZE - 1;
}
}
private static boolean checkCache(String cacheKey) {
CacheObj cacheObj = CACHE_OBJECT_MAP.get(cacheKey);
if (cacheObj == null) {
return false;
}
if (cacheObj.getTtlTime() == -1L) {
return true;
}
if (cacheObj.getTtlTime() < System.currentTimeMillis()) {
deleteCache(cacheKey);
return false;
}
return true;
}
private static void deleteLRU() {
LOGGER.info("delete Least recently used run!");
String cacheKey = null;
synchronized (CACHE_USE_LOG_LIST) {
if (CACHE_USE_LOG_LIST.size() >= CACHE_MAX_NUMBER - 10) {
cacheKey = CACHE_USE_LOG_LIST.remove(CACHE_USE_LOG_LIST.size() - 1);
}
}
if (cacheKey != null) {
deleteCache(cacheKey);
}
}
static void deleteTimeOut() {
LOGGER.info("delete time out run!");
List<String> deleteKeyList = new LinkedList<>();
for(Map.Entry<String, CacheObj> entry : CACHE_OBJECT_MAP.entrySet()) {
if (entry.getValue().getTtlTime() < System.currentTimeMillis() && entry.getValue().getTtlTime() != -1L) {
deleteKeyList.add(entry.getKey());
}
}
for (String deleteKey : deleteKeyList) {
deleteCache(deleteKey);
}
LOGGER.info("delete cache count is :" + deleteKeyList.size());
}
private static void checkSize() {
if (CURRENT_SIZE >= CACHE_MAX_NUMBER) {
deleteTimeOut();
}
if (CURRENT_SIZE >= CACHE_MAX_NUMBER) {
deleteLRU();
}
}
private static synchronized void saveCacheUseLog(String cacheKey) {
synchronized (CACHE_USE_LOG_LIST) {
CACHE_USE_LOG_LIST.remove(cacheKey);
CACHE_USE_LOG_LIST.add(0,cacheKey);
}
}
static void setCleanThreadRun() {
CLEAN_THREAD_IS_RUN = true;
}
private static void startCleanThread() {
if (!CLEAN_THREAD_IS_RUN) {
CleanTimeOutThread cleanTimeOutThread = new CleanTimeOutThread();
Thread thread = new Thread(cleanTimeOutThread);
thread.setDaemon(true);
thread.start();
}
}
}
class CacheObj {
private Object CacheValue;
private Long ttlTime;
CacheObj(Object cacheValue, Long ttlTime) {
CacheValue = cacheValue;
this.ttlTime = ttlTime;
}
Object getCacheValue() {
return CacheValue;
}
Long getTtlTime() {
return ttlTime;
}
@Override
public String toString() {
return "CacheObj {" +
"CacheValue = " + CacheValue +
", ttlTime = " + ttlTime +
'}';
}
}
class CleanTimeOutThread implements Runnable{
@Override
public void run() {
ConcurrentHashMapUtil.setCleanThreadRun();
while (true) {
System.out.println("clean thread run ");
ConcurrentHashMapUtil.deleteTimeOut();
try {
Thread.sleep(ConcurrentHashMapUtil.ONE_MINUTE);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}