新增3ds加密工具类、日期时间格式校验器
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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 {};
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user