实现逻辑
非对称加解密:私钥加密,公钥解密;公钥加密,私钥解密
1,把私钥存入缓存,返回公钥给前端
2,前端通过公钥加密把密文传到后端
3,后端通过key值到redis获取私钥,同时删除redis上key对应的值
4,通过私钥解密的方法解密前端传过来的信息
工具类
public class RedisPrivateUtil {
public static final String PRIVATE_KEY = "he:private:"; // 储存私钥的key值,用于解密公钥加密的密码
public static final int INVALID_DAYS = 1; // 设置过期时间一天
/**
* 缓存加密私钥
* @param key
* @param privateKey 私钥
* @param redisTemplate
*/
private static void setPrivateKey(String key, String privateKey, RedisTemplate redisTemplate) {
String _key = RedisPrivateUtil.PRIVATE_KEY + key;
redisTemplate.opsForValue().set(_key, privateKey, RedisPrivateUtil.INVALID_DAYS, TimeUnit.MINUTES);
}
/**
* 把私钥存入缓存,返回公钥给前端
* @param key
* @param redisTemplate
* @return 公钥
*/
public static String getPublicKey(String key, RedisTemplate redisTemplate) {
try {
KeyPair keyPair = RSACoderUtils.initKey();
String publicKey = Base64.encodeBase64String(keyPair.getPublic().getEncoded()); // 获取公钥
String privateKey = Base64.encodeBase64String(keyPair.getPrivate().getEncoded()); // 获取私钥
RedisPrivateUtil.setPrivateKey(key, privateKey, redisTemplate); // 存入私钥
return publicKey;
} catch (Exception e) {
throw new BaseException(BaseResultEnums.SERVER_IS_TOO_BUSY);
}
}
/**
* 获取缓存中的私钥
* @param key
* @param redisTemplate
* @return 私钥
*/
public static String getPrivateKey(String key, RedisTemplate redisTemplate) {
String _key = RedisPrivateUtil.PRIVATE_KEY + key;
String privateKey = (String) redisTemplate.opsForValue().get(_key);
redisTemplate.delete(RedisPrivateUtil.PRIVATE_KEY + key);
return privateKey;
}
}