perf: 优化登录加密

pull/10/head
Parker 4 years ago
parent 42e82af3df
commit 5a6bc4892c

@ -19,7 +19,9 @@ package org.opsli.common.annotation;
import java.lang.annotation.*; import java.lang.annotation.*;
/** /**
* Api *
*
*
* *
* @author Parker * @author Parker
* @date 202151814:46:02 * @date 202151814:46:02
@ -27,15 +29,9 @@ import java.lang.annotation.*;
@Target(ElementType.METHOD) @Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
@Documented @Documented
public @interface ApiCryptoAsymmetric { public @interface LoginCrypto {
/** 加密启用状态 */ /** 加密启用状态 */
boolean enable() default true; boolean enable() default true;
/** 请求解密 */
boolean requestDecrypt() default true;
/** 返回加密 */
boolean responseEncrypt() default true;
} }

@ -21,8 +21,11 @@ import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.TypeUtil; import cn.hutool.core.util.TypeUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import opsli.plugins.crypto.CryptoPlugin; import opsli.plugins.crypto.CryptoPlugin;
import opsli.plugins.crypto.enums.CryptoSymmetricType;
import opsli.plugins.crypto.model.CryptoAsymmetric; import opsli.plugins.crypto.model.CryptoAsymmetric;
import opsli.plugins.crypto.model.CryptoSymmetric;
import opsli.plugins.crypto.strategy.CryptoAsymmetricService; import opsli.plugins.crypto.strategy.CryptoAsymmetricService;
import opsli.plugins.crypto.strategy.CryptoSymmetricService;
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Aspect;
@ -30,7 +33,7 @@ import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature; import org.aspectj.lang.reflect.MethodSignature;
import org.opsli.api.base.encrypt.BaseEncrypt; import org.opsli.api.base.encrypt.BaseEncrypt;
import org.opsli.api.base.result.ResultVo; import org.opsli.api.base.result.ResultVo;
import org.opsli.common.annotation.ApiCryptoAsymmetric; import org.opsli.common.annotation.LoginCrypto;
import org.opsli.common.exception.ServiceException; import org.opsli.common.exception.ServiceException;
import org.opsli.core.msg.CoreMsg; import org.opsli.core.msg.CoreMsg;
import org.opsli.core.options.CryptoConfigFactory; import org.opsli.core.options.CryptoConfigFactory;
@ -45,7 +48,7 @@ import java.util.Map;
import static org.opsli.common.constants.OrderConstants.ENCRYPT_ADN_DECRYPT_AOP_SORT; import static org.opsli.common.constants.OrderConstants.ENCRYPT_ADN_DECRYPT_AOP_SORT;
/** /**
* Api *
* *
* @author parker * @author parker
* @date 2021-01-23 * @date 2021-01-23
@ -54,9 +57,9 @@ import static org.opsli.common.constants.OrderConstants.ENCRYPT_ADN_DECRYPT_AOP_
@Order(ENCRYPT_ADN_DECRYPT_AOP_SORT) @Order(ENCRYPT_ADN_DECRYPT_AOP_SORT)
@Aspect @Aspect
@Component @Component
public class ApiCryptoAsymmetricAop { public class LoginCryptoAop {
@Pointcut("@annotation(org.opsli.common.annotation.ApiCryptoAsymmetric)") @Pointcut("@annotation(org.opsli.common.annotation.LoginCrypto)")
public void encryptAndDecrypt() { public void encryptAndDecrypt() {
} }
@ -75,12 +78,12 @@ public class ApiCryptoAsymmetricAop {
// 获得 方法 // 获得 方法
Method method = signature.getMethod(); Method method = signature.getMethod();
// 获得方法注解 // 获得方法注解
ApiCryptoAsymmetric annotation = LoginCrypto annotation =
method.getAnnotation(ApiCryptoAsymmetric.class); method.getAnnotation(LoginCrypto.class);
// 获得非对称加解密 执行器 // 获得非对称加解密 执行器
CryptoAsymmetricService asymmetric = null; CryptoAsymmetricService asymmetric = null;
// 加解密模型 // 非对称加解密模型
CryptoAsymmetric cryptoAsymmetric = null; CryptoAsymmetric cryptoAsymmetric = null;
if(annotation != null && annotation.enable()){ if(annotation != null && annotation.enable()){
asymmetric = CryptoPlugin.getAsymmetric(); asymmetric = CryptoPlugin.getAsymmetric();
@ -88,7 +91,7 @@ public class ApiCryptoAsymmetricAop {
} }
// 1. 请求解密 // 1. 请求解密
if(annotation != null && annotation.enable() && annotation.requestDecrypt()){ if(annotation != null && annotation.enable()){
if(cryptoAsymmetric != null){ if(cryptoAsymmetric != null){
enterDecrypt(args, method, asymmetric, cryptoAsymmetric); enterDecrypt(args, method, asymmetric, cryptoAsymmetric);
} }
@ -97,10 +100,16 @@ public class ApiCryptoAsymmetricAop {
// 2. 执行方法 // 2. 执行方法
returnValue = point.proceed(args); returnValue = point.proceed(args);
// 3. 返回加密 // 3. 返回加密 返回加密为对称加密
if(annotation != null && annotation.enable() && annotation.responseEncrypt()){ if(annotation != null && annotation.enable()){
if(cryptoAsymmetric != null){ if(cryptoAsymmetric != null){
returnValue = resultEncrypt(returnValue, asymmetric, cryptoAsymmetric); CryptoSymmetricService symmetric = CryptoPlugin.getSymmetric();
CryptoSymmetric symmetricModel = symmetric.createNilModel();
symmetricModel.setCryptoType(CryptoSymmetricType.DES);
symmetricModel.setPrivateKey(cryptoAsymmetric.getPublicKey());
// 执行加密操作
returnValue = resultEncrypt(returnValue, symmetric, symmetricModel);
} }
} }
return returnValue; return returnValue;
@ -152,12 +161,12 @@ public class ApiCryptoAsymmetricAop {
/** /**
* *
* @param returnValue * @param returnValue
* @param asymmetric * @param symmetric
* @param cryptoModel * @param cryptoModel
* @return Object * @return Object
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private Object resultEncrypt(Object returnValue, CryptoAsymmetricService asymmetric, CryptoAsymmetric cryptoModel) { private Object resultEncrypt(Object returnValue, CryptoSymmetricService symmetric, CryptoSymmetric cryptoModel) {
if(returnValue != null){ if(returnValue != null){
try { try {
// 执行加密过程 // 执行加密过程
@ -165,10 +174,10 @@ public class ApiCryptoAsymmetricAop {
// 重新赋值 data // 重新赋值 data
ResultVo<Object> ret = (ResultVo<Object>) returnValue; ResultVo<Object> ret = (ResultVo<Object>) returnValue;
ret.setData( ret.setData(
asymmetric.encrypt(cryptoModel, ret.getData()) symmetric.encrypt(cryptoModel, ret.getData())
); );
}else { }else {
returnValue = asymmetric.encrypt(cryptoModel, returnValue); returnValue = symmetric.encrypt(cryptoModel, returnValue);
} }
}catch (Exception e){ }catch (Exception e){
// 非对称加密失败 // 非对称加密失败

@ -26,7 +26,7 @@ import org.opsli.api.wrapper.system.menu.MenuModel;
import org.opsli.api.wrapper.system.options.OptionsModel; import org.opsli.api.wrapper.system.options.OptionsModel;
import org.opsli.api.wrapper.system.tenant.TenantModel; import org.opsli.api.wrapper.system.tenant.TenantModel;
import org.opsli.api.wrapper.system.user.UserModel; import org.opsli.api.wrapper.system.user.UserModel;
import org.opsli.common.annotation.ApiCryptoAsymmetric; import org.opsli.common.annotation.LoginCrypto;
import org.opsli.common.annotation.Limiter; import org.opsli.common.annotation.Limiter;
import org.opsli.common.enums.DictType; import org.opsli.common.enums.DictType;
import org.opsli.common.thread.AsyncProcessExecutor; import org.opsli.common.thread.AsyncProcessExecutor;
@ -73,7 +73,7 @@ public class LoginRestController {
* *
*/ */
@Limiter @Limiter
@ApiCryptoAsymmetric(responseEncrypt = false) @LoginCrypto
@ApiOperation(value = "登录", notes = "登录") @ApiOperation(value = "登录", notes = "登录")
@PostMapping("/system/login") @PostMapping("/system/login")
public ResultVo<UserTokenUtil.TokenRet> login(@RequestBody LoginForm form, HttpServletRequest request){ public ResultVo<UserTokenUtil.TokenRet> login(@RequestBody LoginForm form, HttpServletRequest request){

@ -18,8 +18,12 @@ package opsli.plugins.crypto.strategy.impl;
import cn.hutool.core.codec.Base64; import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.SmUtil; import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.symmetric.AES;
import cn.hutool.crypto.symmetric.DES;
import cn.hutool.crypto.symmetric.SymmetricCrypto; import cn.hutool.crypto.symmetric.SymmetricCrypto;
import cn.hutool.json.JSONException; import cn.hutool.json.JSONException;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
@ -245,11 +249,11 @@ public class CryptoSymmetricServiceImpl implements CryptoSymmetricService {
byte[] keyBytes = Base64.decode(model.getPrivateKey()); byte[] keyBytes = Base64.decode(model.getPrivateKey());
switch (model.getCryptoType()) { switch (model.getCryptoType()) {
case AES:{ case AES:{
tmp = SecureUtil.aes(keyBytes); tmp = new AES(Mode.ECB, Padding.PKCS5Padding, keyBytes);
break; break;
} }
case DES:{ case DES:{
tmp = SecureUtil.des(keyBytes); tmp = new DES(Mode.ECB, Padding.PKCS5Padding, keyBytes);
break; break;
} }
case DE_SEDE:{ case DE_SEDE:{

Loading…
Cancel
Save