新增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