package org.dromara.common.encrypt.core; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReflectUtil; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import java.lang.reflect.Field; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; /** * 加密管理类 * * @author 老马 * @version 4.6.0 */ @Slf4j @NoArgsConstructor public class EncryptorManager { /** * 缓存加密器 */ Map encryptorMap = new ConcurrentHashMap<>(); /** * 类加密字段缓存 */ Map, Set> fieldCache = new ConcurrentHashMap<>(); /** * 构造方法传入类加密字段缓存 * * @param fieldCache 类加密字段缓存 */ public EncryptorManager(Map, Set> fieldCache) { this.fieldCache = fieldCache; } /** * 获取类加密字段缓存 */ public Set getFieldCache(Class sourceClazz) { if(ObjectUtil.isNotNull(fieldCache)) { return fieldCache.get(sourceClazz); } return null; } /** * 注册加密执行者到缓存 * * @param encryptContext 加密执行者需要的相关配置参数 */ public IEncryptor registAndGetEncryptor(EncryptContext encryptContext) { if (encryptorMap.containsKey(encryptContext)) { return encryptorMap.get(encryptContext); } IEncryptor encryptor = ReflectUtil.newInstance(encryptContext.getAlgorithm().getClazz(), encryptContext); encryptorMap.put(encryptContext, encryptor); return encryptor; } /** * 移除缓存中的加密执行者 * * @param encryptContext 加密执行者需要的相关配置参数 */ public void removeEncryptor(EncryptContext encryptContext) { this.encryptorMap.remove(encryptContext); } /** * 根据配置进行加密。会进行本地缓存对应的算法和对应的秘钥信息。 * * @param value 待加密的值 * @param encryptContext 加密相关的配置信息 */ public String encrypt(String value, EncryptContext encryptContext) { IEncryptor encryptor = this.registAndGetEncryptor(encryptContext); return encryptor.encrypt(value, encryptContext.getEncode()); } /** * 根据配置进行解密 * * @param value 待解密的值 * @param encryptContext 加密相关的配置信息 */ public String decrypt(String value, EncryptContext encryptContext) { IEncryptor encryptor = this.registAndGetEncryptor(encryptContext); return encryptor.decrypt(value); } }