前端:VUE + Element-Ui
后端:SpringBoot
公匙加密、私匙解密
rsa公匙rsa公匙 和 JSEncrypt加密后的rsa密码token,在以后的请求中 请求头携带该token进行访问存入redis key:公匙 value:私匙根据公匙从redis获取私匙进行解密 密码token的有效性安装插件jsencrypt
npm install jsencrypt
登录页面引入
import {JSEncrypt} from 'jsencrypt'
加密
// 新建JSEncrypt对象
let encrypt = new JSEncrypt()
// 公钥加密
encrypt.setPublicKey(loginParams.rsaPublicKey)
let passwordEncrpt = encrypt.encrypt(values.password)
<dependency>
<groupId>cn.hutoolgroupId>
<artifactId>hutool-allartifactId>
<version>5.3.8version>
dependency>
@ApiOperation("获取RSA公钥")
@GetMapping("/getRSAPublicKey")
public Result<String> getRSAPublicKey() {
RSA rsa = new RSA();
// 私匙
String privateKeyBase64 = rsa.getPrivateKeyBase64();
// 公匙
String publicKeyBase64 = rsa.getPublicKeyBase64();
//存到redis key为公钥 value为私钥
redisUtil.set(publicKeyBase64, privateKeyBase64, 300L);
return Result.message(publicKeyBase64);
}
public class JWTUtils {
/**
* 生成token,一小时后过期
* @param username 用户名
* @param secret 秘钥
* @return
*/
public static String sign(String username,String secret) {
// 创建 token
String token = JWT.create()
// 数据(也就是 payload 负载)
.withClaim("username", username)
//过期时间 1小时
.withExpiresAt(DateUtil.offsetHour(new Date(),1))
// 设置秘钥
.sign(Algorithm.HMAC256(secret));
return token;
}
/**
* 解密token
* @param token
* @throws Exception
* @return
*/
public static DecodedJWT decoded(String token){
DecodedJWT decode = null;
try {
decode = JWT.decode(token);
}catch (JWTDecodeException e){
return null;
}
return decode;
}
/**
* 根据request中的token获取用户账号
*
* @param request
* @return
*/
public static String getUserNameByToken(HttpServletRequest request) throws Exception {
String accessToken = request.getHeader("X-Access-Token");
String username = getUserNameByToken(accessToken);
if (!StringUtils.hasLength(username)) {
throw new Exception("未获取到用户");
}
return username;
}
/**
* 获得token中的信息无需secret解密也能获得
*
* @return token中包含的用户名
*/
public static String getUserNameByToken(String token) {
try {
DecodedJWT jwt = JWT.decode(token);
return jwt.getClaim("username").asString();
} catch (JWTDecodeException e) {
return null;
}
}
/**
* 校验token是否正确
*
* @param token 密钥
* @param secret 用户的密码
* @return 是否正确
*/
public static boolean verify(String token, String username, String secret) {
try {
// 根据密码生成JWT效验器
DecodedJWT jwt = JWT.require(Algorithm.HMAC256(secret))
.withClaim("username", username)
.build()
.verify(token);
// 效验TOKEN
return true;
} catch (Exception exception) {
return false;
}
}
}
@GetMapping("/getPublicKey")
public String getPublicKey(){
RSA rsa = new RSA();
redisUtil.set(rsa.getPublicKeyBase64(),rsa.getPrivateKeyBase64(),300L);
return rsa.getPublicKeyBase64();
}
// 根据公匙 从redis中获取 私匙
String rsaPrivateKey = String.valueOf(redisUtil.get(rsaPublicKey));
RSA rsa = new RSA(rsaPrivateKey, rsaPublicKey);
// 解密
byte[] decrypt = rsa.decrypt(str, KeyType.PrivateKey);
String password = new String(decrypt);
// 生成token
String token = JWTUtils.sign(username, "签名");
// 将token存入redis
redisUtil.set("user_"+username,token);