新增3ds加密工具类、日期时间格式校验器

This commit is contained in:
caozehui
2024-11-07 11:34:38 +08:00
parent bfeceb42c7
commit 99925b8db3
3 changed files with 220 additions and 0 deletions

View File

@@ -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;
}
}

View File

@@ -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<DateTimeStrValid, String> {
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;
}
}

View File

@@ -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<? extends Payload>[] payload() default {};
}