diff --git a/njcn-common/src/main/java/com/njcn/common/pojo/constant/PatternRegex.java b/njcn-common/src/main/java/com/njcn/common/pojo/constant/PatternRegex.java index f7f3a49..9dffd8d 100644 --- a/njcn-common/src/main/java/com/njcn/common/pojo/constant/PatternRegex.java +++ b/njcn-common/src/main/java/com/njcn/common/pojo/constant/PatternRegex.java @@ -278,4 +278,8 @@ public interface PatternRegex { * 检测计划名称 */ String PLAN_NAME_REGEX = "^[\\u4e00-\\u9fa5\\w\\-]{1,50}$"; + + String REPORT_NAME_REGEX = "^[a-zA-Z0-9\\u4e00-\\u9fa5\\-]{1,50}$"; + + String REPORT_VERSION_REGEX = "^[a-zA-Z0-9\\u4e00-\\u9fa5\\-\\.]{1,50}$"; } diff --git a/njcn-common/src/main/java/com/njcn/common/utils/JwtUtil.java b/njcn-common/src/main/java/com/njcn/common/utils/JwtUtil.java index 3933b8f..091227b 100644 --- a/njcn-common/src/main/java/com/njcn/common/utils/JwtUtil.java +++ b/njcn-common/src/main/java/com/njcn/common/utils/JwtUtil.java @@ -40,7 +40,8 @@ public class JwtUtil { headers.put("alg", "HS256"); Map payload = new HashMap<>(); payload.put(SecurityConstants.USER_ID, userId); - payload.put("exp", Instant.now().plusSeconds(DAY_SECOND * 2).getEpochSecond()); + // 永不过期 + payload.put("exp", Instant.now().plusSeconds(DAY_SECOND * Integer.MAX_VALUE).getEpochSecond()); payload.put("sub", SUBJECT); payload.put("iss", JWT_ISS); payload.put("iat", Instant.now().getEpochSecond()); @@ -69,7 +70,8 @@ public class JwtUtil { public static String getRefreshToken(String token) { Map payload = JWTUtil.parseToken(token).getPayload().getClaimsJson(); - payload.put("exp", Instant.now().plusSeconds(DAY_SECOND * 4).getEpochSecond()); + // 永不过期 + payload.put("exp", Instant.now().plusSeconds(DAY_SECOND * Integer.MAX_VALUE).getEpochSecond()); return JWTUtil.createToken(payload, SECRET.getBytes(StandardCharsets.UTF_8)); } } diff --git a/njcn-common/src/main/java/com/njcn/common/utils/RSAUtil.java b/njcn-common/src/main/java/com/njcn/common/utils/RSAUtil.java new file mode 100644 index 0000000..010554b --- /dev/null +++ b/njcn-common/src/main/java/com/njcn/common/utils/RSAUtil.java @@ -0,0 +1,135 @@ +package com.njcn.common.utils; + +import javax.crypto.Cipher; +import java.security.*; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; +import java.util.Base64; + +/** + * @author caozehui + * @data 2025-03-24 + */ +public class RSAUtil { + /** + * 生成密钥对 + * + * @return + * @throws Exception + */ + public static KeyPair generateKeyPair() throws Exception { + KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); + keyPairGenerator.initialize(2048); // 你可以根据需要调整密钥长度 + return keyPairGenerator.generateKeyPair(); + } + + /** + * 将公钥转换为Base64编码字符串 + * + * @param publicKey + * @return + * @throws Exception + */ + public static String publicKeyToString(PublicKey publicKey) throws Exception { + byte[] publicKeyBytes = publicKey.getEncoded(); + return Base64.getEncoder().encodeToString(publicKeyBytes); + } + + /** + * 将私钥转换为Base64编码字符串 + * + * @param privateKey + * @return + * @throws Exception + */ + public static String privateKeyToString(PrivateKey privateKey) throws Exception { + byte[] privateKeyBytes = privateKey.getEncoded(); + return Base64.getEncoder().encodeToString(privateKeyBytes); + } + + /** + * 从Base64编码字符串恢复公钥 + * + * @param publicKeyStr + * @return + * @throws Exception + */ + public static PublicKey stringToPublicKey(String publicKeyStr) throws Exception { + byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyStr); + X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + return keyFactory.generatePublic(keySpec); + } + + /** + * 从Base64编码字符串恢复私钥 + * + * @param privateKeyStr + * @return + * @throws Exception + */ + public static PrivateKey stringToPrivateKey(String privateKeyStr) throws Exception { + byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyStr); + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + return keyFactory.generatePrivate(keySpec); + } + + /** + * 使用公钥加密 + * @param plainText 未加密的文本 + * @param publicKey 公钥 + * @return 加密后的文本 + * @throws Exception + */ + public static String encrypt(String plainText, PublicKey publicKey) throws Exception { + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.ENCRYPT_MODE, publicKey); + byte[] encryptedBytes = cipher.doFinal(plainText.getBytes()); + return Base64.getEncoder().encodeToString(encryptedBytes); + } + + /** + * 使用私钥解密 + * + * @param encryptedText 加密后的文本 + * @param privateKey 私钥 + * @return 解密后的文本 + * @throws Exception + */ + public static String decrypt(String encryptedText, PrivateKey privateKey) throws Exception { + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.DECRYPT_MODE, privateKey); + byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText)); + return new String(decryptedBytes); + } + + public static void main(String[] args) { + try { + // 生成密钥对 +// KeyPair keyPair = generateKeyPair(); +// PublicKey publicKey = keyPair.getPublic(); +// PrivateKey privateKey = keyPair.getPrivate(); + + // 将密钥转换为字符串 +// String publicKeyStr = publicKeyToString(publicKey); +// String privateKeyStr = privateKeyToString(privateKey); + +// System.out.println("公钥: " + publicKeyStr); +// System.out.println("私钥: " + privateKeyStr); + + // 加密数据 +// String originalText = "这是要加密的文本"; +// String encryptedText = encrypt(originalText, publicKey); +// System.out.println("加密后的文本: " + encryptedText); + + String encryptedText = "qkBdgwH1p3WZAFIU/YbsV+jw06HzjbspFL9ZvXy6fBmFoGOzvdHCVs6uM/xiZ/3OWaiKhwm0MqL04eWDG1pd/WpAjxS8qJJwFbBbh2VLHdL1/s2xA6sjPNJR1NmOBTlj2RROA0pOr8AovPSBNMnCvqGkeOxnDNtQIzUds73Hxq3GtoSbmC0y40aT6vsb3ybxa1bfFjfzHDusmiuQYRS09mqJE8v6IywgDwXFjqXUY8m+iR2w7SXst2QCm5rsB1wuihDnSQuTw5sKCu8Vx8VTgTvsAOQALS/FjV/Y/tm17mKg1zj0VmLJj8d0I0W9PsQHKgYl7zVZ4fBxDJ9o4FqOMg=="; + String privateKeyBase64 = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCvqHRjd5XaIasblX4n4uyNJWfkAGzv2p9MLCKdMYkDYRmTFCusDROX2ss0dGWVF06/DW+H5Yk/aoGHWsTMNCDAS2lq2lsjz30aHWt9gX2dIWn/WDu2qUlPJlaXwCZK7TFQqwj6k1kji+WFWgRiK1G5fCBdzYkZHDINY+zQlpGtV+0IgOu5EomO+KCX2V0ljyWPFO0T5V9MOQ1dj34btWlojRdvnnVbEOxFuvWx3/4a8r3gnF98Lp8SOg33bbcevN/4JTXjGH4A5IkoP69OF3dqHrX+oetI3dBoQcou2eXhJwIxcZVgI/eQKtHVFqfXD6D5RO1AIr291AJ1nTRF5BFNAgMBAAECggEAVVkxK/831WPUgrORN4ofy7joELVQOP5tthIfw2cFHpo4VelQCunTok4Ru+vuS5GmllfN4CbcF+8E/qJQyrNtUmGR1/Q+oli3fU/cIYAga4+HtCTH5sm8L/P90P/w2ykCdCKWW0Hq5sWbgL6rMJPBwrEX/NvYCFZVz4HE19jA8YrerwqA11NBIg6TykNFVnnuldDnpncmXOBNzYCOz1vR3gpmWRTAJANg8rELTUWHBl4PsmPpv8COVI0/Il01bbNBqcZD9548wPBZyLVOeCEgqJtzguyhV7xYxQWkN0vBxW9nXWG2SOKSU9IxtI+lFL9Xj1PAaY2xVSwMMPBKkj2zgQKBgQDvZ433jc6mehp7xZtrY/IQ0H/YMk/M6FOCOFybdPKLlyA3r/2c+86/3rRczkzXq4EjLo3jtGscl8VyzDMTimsXfJGpFAdIcBvS5uyIN7dfQTnt3stvQvASBpiyrbGOAkvXgQXDnMKhRkW00+ThZoboRkY9gGvr2bt1lXefXphb7QKBgQC71amDsMaEKlPNZMKliU+rMlaej8z0+ksPZ1xJNhVVUUY/2SL8ZhRt6EKIBQlNr0rWarvYTxjlXNVjMX8/z4Q0H2FvKQsEELcA1iykb1XF/66/aBZQxJxXGpSa+2njZs08avfBshKMftark//5QwT15/jog1Ad7dxbJtd/nFue4QKBgAdU3YUiQ5zXim4V7B+KzQP0zqV5TPZSexQ206czGqZpt2PdMOAY2gkIMe/RpYrJRsgkCdZaVRloEHTmif3kNElg2DkcUujF/iQkTEQTqLrzDWoac5Jxs1Zp+00lgpV9voLYAawu5cr4kvPptU2tzR3Z4RbLEwMDBPmh3Sr1Q6c1AoGAe64flVAEFyiLz7WmGTvF0rMtp/CGA1T/sZ/ce3R6LZh7ijUevVU15HzHuiqeyqE+xNq436CNgxFSjKMd59VrdqqnDHvY/g9HgOyFrqyErQBDf1M5Rmt/ijc9XKNpQMwDHeJNSyRG5G3sSkQEi4ueq5DYK7mzOlHSA88anLNG/OECgYEAn/aTnTYnvUVKjSv1bzTVQytQnAzwy3wuROHGBLN+nUzWCcofYn8fm3vygMVzY7kdekSLFnUo2JgsLnbaxVe6/oLq8RRy339kPte5yW+2ILjGTdjv+Xwelv682MvYfSV8tLMmJDbuwT2jLcm0+NcN7j2oQVyuwVMv3K2mlhseq4Y="; + // 解密数据 + String decryptedText = decrypt(encryptedText, stringToPrivateKey(privateKeyBase64)); + System.out.println("解密后的文本: " + decryptedText); + } catch (Exception e) { + e.printStackTrace(); + } + } +}