package com.admin.config; import com.admin.common.utils.AESCrypto; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.util.concurrent.ConcurrentHashMap; /** * 加密配置管理类 * 统一管理AES加密功能,为HTTP上报和WebSocket通信提供加密支持 */ @Component @Slf4j public class EncryptionConfig { // 缓存加密器实例,避免重复创建 private static final ConcurrentHashMap CRYPTO_CACHE = new ConcurrentHashMap<>(); /** * 获取或创建AES加密器实例 * * @param secret 密钥字符串 * @return AES加密器实例,如果创建失败返回null */ public static AESCrypto getOrCreateCrypto(String secret) { if (secret == null || secret.isEmpty()) { return null; } return CRYPTO_CACHE.computeIfAbsent(secret, AESCrypto::create); } /** * 检测消息是否为加密格式 * * @param message 消息内容 * @return 如果是加密格式返回true,否则返回false */ public static boolean isEncryptedMessage(String message) { if (message == null || message.trim().isEmpty()) { return false; } try { // 简单检查是否包含加密标识 return message.contains("\"encrypted\":true") || message.contains("\"encrypted\": true"); } catch (Exception e) { return false; } } /** * 清理缓存的加密器实例 * * @param secret 要清理的密钥 */ public static void clearCrypto(String secret) { if (secret != null) { CRYPTO_CACHE.remove(secret); log.info("已清理密钥对应的加密器实例"); } } /** * 清理所有缓存的加密器实例 */ public static void clearAllCrypto() { int size = CRYPTO_CACHE.size(); CRYPTO_CACHE.clear(); log.info("已清理所有加密器实例缓存,共清理 {} 个实例", size); } /** * 获取当前缓存的加密器数量 * * @return 缓存的加密器数量 */ public static int getCacheSize() { return CRYPTO_CACHE.size(); } }