From 99925b8db3775cb2f6814b746715858885cf862c Mon Sep 17 00:00:00 2001 From: caozehui <2427765068@qq.com> Date: Thu, 7 Nov 2024 11:34:38 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E3ds=E5=8A=A0=E5=AF=86?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB=E3=80=81=E6=97=A5=E6=9C=9F=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E6=A0=BC=E5=BC=8F=E6=A0=A1=E9=AA=8C=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../njcn/common/utils/sm/ThreeDesUtil.java | 151 ++++++++++++++++++ .../njcn/web/config/DateTimeValidator.java | 41 +++++ .../web/pojo/annotation/DateTimeStrValid.java | 28 ++++ 3 files changed, 220 insertions(+) create mode 100644 njcn-common/src/main/java/com/njcn/common/utils/sm/ThreeDesUtil.java create mode 100644 njcn-springboot/spingboot2.3.12/src/main/java/com/njcn/web/config/DateTimeValidator.java create mode 100644 njcn-springboot/spingboot2.3.12/src/main/java/com/njcn/web/pojo/annotation/DateTimeStrValid.java diff --git a/njcn-common/src/main/java/com/njcn/common/utils/sm/ThreeDesUtil.java b/njcn-common/src/main/java/com/njcn/common/utils/sm/ThreeDesUtil.java new file mode 100644 index 0000000..b6ca903 --- /dev/null +++ b/njcn-common/src/main/java/com/njcn/common/utils/sm/ThreeDesUtil.java @@ -0,0 +1,151 @@ +package com.njcn.common.utils.sm; + +import lombok.extern.slf4j.Slf4j; + +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; + +/** + * 字符串 DESede(3DES) 加密 + * ECB模式/使用PKCS7方式填充不足位,目前给的密钥是192位 + * 3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的 + * 加密标准),是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加 + * 密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的 + * 密钥,P代表明文,C代表密表,这样, + * 3DES加密过程为:C=Ek3(Dk2(Ek1(P))) + * 3DES解密过程为:P=Dk1((EK2(Dk3(C))) + * + * @date 2023/8/28 + */ +@Slf4j +public class ThreeDesUtil { + + /** + * @param args在java中调用sun公司提供的3DES加密解密算法时,需要使 + * 用到$JAVA_HOME/jre/lib/目录下如下的4个jar包: + * jce.jar + * security/US_export_policy.jar + * security/local_policy.jar + * ext/sunjce_provider.jar + * 定义加密算法,可用 DES,DESede,Blowfish + */ + + private static final String Algorithm = "DESede"; + // 24字节的密钥 + private static final byte[] keyBytes = {0x11, 0x22, 0x4F, 0x58, (byte) 0x88, 0x10, + 0x40, 0x38, 0x28, 0x25, 0x79, 0x51, (byte) 0xCB, (byte) 0xDD, + 0x55, 0x66, 0x77, 0x29, 0x74, (byte) 0x98, 0x30, 0x40, 0x36, + (byte) 0xE2}; + + + //keybyte为加密密钥,长度为24字节 + //src为被加密的数据缓冲区(源) + public static byte[] encryptMode(byte[] keybyte, byte[] src) { + try { + //生成密钥 + SecretKey deskey = new SecretKeySpec(keybyte, Algorithm); + //加密 + Cipher c1 = Cipher.getInstance(Algorithm); + c1.init(Cipher.ENCRYPT_MODE, deskey); + //在单一方面的加密或解密 + return c1.doFinal(src); + } catch (java.security.NoSuchAlgorithmException e1) { + log.error(e1.getMessage()); + } catch (javax.crypto.NoSuchPaddingException e2) { + log.error(e2.getMessage()); + } catch (Exception e3) { + log.error(e3.getMessage()); + } + return null; + } + + //keybyte为加密密钥,长度为24字节 + //src为解密后的缓冲区 + public static byte[] decryptMode(byte[] keybyte, byte[] src) { + try { + //生成密钥 + SecretKey deskey = new SecretKeySpec(keybyte, Algorithm); + //解密 + Cipher c1 = Cipher.getInstance(Algorithm); + c1.init(Cipher.DECRYPT_MODE, deskey); + return c1.doFinal(src); + } catch (java.security.NoSuchAlgorithmException e1) { + log.error(e1.getMessage()); + } catch (javax.crypto.NoSuchPaddingException e2) { + log.error(e2.getMessage()); + } catch (Exception e3) { + log.error(e3.getMessage()); + } + return null; + } + + //转换成十六进制字符串 + public static String byte2Hex(byte[] b) { + String hs = ""; + String stmp = ""; + for (int n = 0; n < b.length; n++) { + stmp = (Integer.toHexString(b[n] & 0XFF)); + if (stmp.length() == 1) { + hs = hs + "0" + stmp; + } else { + hs = hs + stmp; + } + if (n < b.length - 1) { + hs = hs + ":"; + } + } + return hs.toUpperCase(); + } + + //对数据进行3des加密 + public static String encryptThreeDes_64(String str) { + byte[] encoded = encryptMode(keyBytes, str.getBytes()); + return (new sun.misc.BASE64Encoder()).encode(encoded); + } + + + //字节码转换成16进制字符串 + public static String byte2hex(byte bytes[]) { + StringBuffer retString = new StringBuffer(); + for (int i = 0; i < bytes.length; ++i) { + retString.append(Integer.toHexString(0x0100 + (bytes[i] & 0x00FF)).substring(1).toUpperCase()); + } + return retString.toString(); + } + + //将16进制字符串转换成字节码 + public static byte[] hex2byte(String hex) { + byte[] bts = new byte[hex.length() / 2]; + for (int i = 0; i < bts.length; i++) { + bts[i] = (byte) Integer.parseInt(hex.substring(2 * i, 2 * i + 2), 16); + } + return bts; + } + + //对Cookie进行加密 + public static String encryptThreeDes(String strencoded) { + byte[] encoded = encryptMode(keyBytes, strencoded.getBytes()); + return byte2hex(encoded); + } + + //对Cookie进行解密 + public static String decryptThreeDes(String strdecrypt) { + byte[] decrypt = decryptMode(keyBytes, hex2byte(strdecrypt)); + return new String(decrypt); + } + + + //判断数据完整性 + public static Boolean hex(String psw, String strkey) { + boolean flag = true; + String key = encryptThreeDes_64(strkey); + if (!psw.equals(key)) { + flag = false; + } + return flag; + } + + +} + diff --git a/njcn-springboot/spingboot2.3.12/src/main/java/com/njcn/web/config/DateTimeValidator.java b/njcn-springboot/spingboot2.3.12/src/main/java/com/njcn/web/config/DateTimeValidator.java new file mode 100644 index 0000000..ce8bebf --- /dev/null +++ b/njcn-springboot/spingboot2.3.12/src/main/java/com/njcn/web/config/DateTimeValidator.java @@ -0,0 +1,41 @@ +package com.njcn.web.config; + +import cn.hutool.core.util.StrUtil; +import com.njcn.web.pojo.annotation.DateTimeStrValid; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.text.SimpleDateFormat; + +/** + * @author caozehui + * @data 2024/11/6 + */ +public class DateTimeValidator implements ConstraintValidator { + private DateTimeStrValid dateTime; + @Override + public void initialize(DateTimeStrValid dateTime) { + this.dateTime = dateTime; + } + + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + if (StrUtil.isBlank(value)) { + return true; + } + String format = dateTime.format(); + + if (value.length() != format.length()) { + return false; + } + + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format); + + try { + simpleDateFormat.parse(value); + } catch (Exception e) { + return false; + } + return true; + } +} \ No newline at end of file diff --git a/njcn-springboot/spingboot2.3.12/src/main/java/com/njcn/web/pojo/annotation/DateTimeStrValid.java b/njcn-springboot/spingboot2.3.12/src/main/java/com/njcn/web/pojo/annotation/DateTimeStrValid.java new file mode 100644 index 0000000..0211fc8 --- /dev/null +++ b/njcn-springboot/spingboot2.3.12/src/main/java/com/njcn/web/pojo/annotation/DateTimeStrValid.java @@ -0,0 +1,28 @@ +package com.njcn.web.pojo.annotation; + +import com.njcn.web.config.DateTimeValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author caozehui + * @date 2024/11/6 + */ +@Target({ElementType.FIELD, ElementType.PARAMETER}) +@Retention(RetentionPolicy.RUNTIME) +@Constraint(validatedBy = DateTimeValidator.class) +public @interface DateTimeStrValid { + String message() default "时间格式错误"; + + String format() default "yyyy-MM-dd"; + + Class[] groups() default {}; + + Class[] payload() default {}; + +} \ No newline at end of file