This commit is contained in:
Looly 2023-04-26 23:01:51 +08:00
parent 84deef4ca4
commit 49a6611ae8
17 changed files with 110 additions and 65 deletions

View File

@ -21,8 +21,8 @@ import org.dromara.hutool.crypto.asymmetric.AsymmetricAlgorithm;
import org.dromara.hutool.crypto.asymmetric.RSA;
import org.dromara.hutool.crypto.digest.DigestAlgorithm;
import org.dromara.hutool.crypto.digest.Digester;
import org.dromara.hutool.crypto.digest.HMac;
import org.dromara.hutool.crypto.digest.HmacAlgorithm;
import org.dromara.hutool.crypto.digest.mac.HMac;
import org.dromara.hutool.crypto.digest.mac.HmacAlgorithm;
import org.dromara.hutool.crypto.digest.MD5;
import org.dromara.hutool.crypto.provider.GlobalProviderFactory;
import org.dromara.hutool.crypto.symmetric.*;

View File

@ -25,8 +25,8 @@ import org.dromara.hutool.core.array.ArrayUtil;
import org.dromara.hutool.core.io.IORuntimeException;
import org.dromara.hutool.crypto.CryptoException;
import org.dromara.hutool.crypto.asymmetric.SM2;
import org.dromara.hutool.crypto.digest.HMac;
import org.dromara.hutool.crypto.digest.HmacAlgorithm;
import org.dromara.hutool.crypto.digest.mac.HMac;
import org.dromara.hutool.crypto.digest.mac.HmacAlgorithm;
import org.dromara.hutool.crypto.digest.SM3;
import org.dromara.hutool.crypto.digest.mac.BCHMacEngine;
import org.dromara.hutool.crypto.digest.mac.MacEngine;

View File

@ -13,6 +13,8 @@
package org.dromara.hutool.crypto.digest;
import org.dromara.hutool.core.util.CharsetUtil;
import org.dromara.hutool.crypto.digest.mac.HMac;
import org.dromara.hutool.crypto.digest.mac.HmacAlgorithm;
import javax.crypto.SecretKey;
import java.io.File;
@ -26,7 +28,7 @@ import java.nio.charset.Charset;
*/
public class DigestUtil {
// ------------------------------------------------------------------------------------------- MD5
// region ----- MD5
/**
* 计算32位MD5摘要值
@ -131,7 +133,9 @@ public class DigestUtil {
return new MD5().digestHex(file);
}
// ------------------------------------------------------------------------------------------- MD5 16
// endregion
// region ----- MD5 16
/**
* 计算16位MD5摘要值并转为16进制字符串
@ -200,7 +204,9 @@ public class DigestUtil {
return md5Hex.substring(8, 24);
}
// ------------------------------------------------------------------------------------------- SHA-1
// endregion
// region ----- SHA-1
/**
* 计算SHA-1摘要值
@ -209,7 +215,7 @@ public class DigestUtil {
* @return SHA-1摘要
*/
public static byte[] sha1(final byte[] data) {
return new Digester(DigestAlgorithm.SHA1).digest(data);
return digester(DigestAlgorithm.SHA1).digest(data);
}
/**
@ -220,7 +226,7 @@ public class DigestUtil {
* @return SHA-1摘要
*/
public static byte[] sha1(final String data, final Charset charset) {
return new Digester(DigestAlgorithm.SHA1).digest(data, charset);
return digester(DigestAlgorithm.SHA1).digest(data, charset);
}
/**
@ -240,7 +246,7 @@ public class DigestUtil {
* @return SHA-1摘要
*/
public static byte[] sha1(final InputStream data) {
return new Digester(DigestAlgorithm.SHA1).digest(data);
return digester(DigestAlgorithm.SHA1).digest(data);
}
/**
@ -250,7 +256,7 @@ public class DigestUtil {
* @return SHA-1摘要
*/
public static byte[] sha1(final File file) {
return new Digester(DigestAlgorithm.SHA1).digest(file);
return digester(DigestAlgorithm.SHA1).digest(file);
}
/**
@ -260,7 +266,7 @@ public class DigestUtil {
* @return SHA-1摘要的16进制表示
*/
public static String sha1Hex(final byte[] data) {
return new Digester(DigestAlgorithm.SHA1).digestHex(data);
return digester(DigestAlgorithm.SHA1).digestHex(data);
}
/**
@ -271,7 +277,7 @@ public class DigestUtil {
* @return SHA-1摘要的16进制表示
*/
public static String sha1Hex(final String data, final Charset charset) {
return new Digester(DigestAlgorithm.SHA1).digestHex(data, charset);
return digester(DigestAlgorithm.SHA1).digestHex(data, charset);
}
/**
@ -291,7 +297,7 @@ public class DigestUtil {
* @return SHA-1摘要的16进制表示
*/
public static String sha1Hex(final InputStream data) {
return new Digester(DigestAlgorithm.SHA1).digestHex(data);
return digester(DigestAlgorithm.SHA1).digestHex(data);
}
/**
@ -301,10 +307,12 @@ public class DigestUtil {
* @return SHA-1摘要的16进制表示
*/
public static String sha1Hex(final File file) {
return new Digester(DigestAlgorithm.SHA1).digestHex(file);
return digester(DigestAlgorithm.SHA1).digestHex(file);
}
// ------------------------------------------------------------------------------------------- SHA-256
// endregion
// region ----- SHA-256
/**
* 计算SHA-256摘要值
@ -314,7 +322,7 @@ public class DigestUtil {
* @since 3.0.8
*/
public static byte[] sha256(final byte[] data) {
return new Digester(DigestAlgorithm.SHA256).digest(data);
return digester(DigestAlgorithm.SHA256).digest(data);
}
/**
@ -336,7 +344,7 @@ public class DigestUtil {
* @return SHA-256摘要
*/
public static byte[] sha256(final String data, final Charset charset) {
return new Digester(DigestAlgorithm.SHA256).digest(data, charset);
return digester(DigestAlgorithm.SHA256).digest(data, charset);
}
/**
@ -347,7 +355,7 @@ public class DigestUtil {
* @since 3.0.8
*/
public static byte[] sha256(final InputStream data) {
return new Digester(DigestAlgorithm.SHA256).digest(data);
return digester(DigestAlgorithm.SHA256).digest(data);
}
/**
@ -358,7 +366,7 @@ public class DigestUtil {
* @since 3.0.8
*/
public static byte[] sha256(final File file) {
return new Digester(DigestAlgorithm.SHA256).digest(file);
return digester(DigestAlgorithm.SHA256).digest(file);
}
/**
@ -369,7 +377,7 @@ public class DigestUtil {
* @since 3.0.8
*/
public static String sha256Hex(final byte[] data) {
return new Digester(DigestAlgorithm.SHA256).digestHex(data);
return digester(DigestAlgorithm.SHA256).digestHex(data);
}
/**
@ -381,7 +389,7 @@ public class DigestUtil {
* @since 3.0.8
*/
public static String sha256Hex(final String data, final Charset charset) {
return new Digester(DigestAlgorithm.SHA256).digestHex(data, charset);
return digester(DigestAlgorithm.SHA256).digestHex(data, charset);
}
/**
@ -403,7 +411,7 @@ public class DigestUtil {
* @since 3.0.8
*/
public static String sha256Hex(final InputStream data) {
return new Digester(DigestAlgorithm.SHA256).digestHex(data);
return digester(DigestAlgorithm.SHA256).digestHex(data);
}
/**
@ -414,10 +422,12 @@ public class DigestUtil {
* @since 3.0.8
*/
public static String sha256Hex(final File file) {
return new Digester(DigestAlgorithm.SHA256).digestHex(file);
return digester(DigestAlgorithm.SHA256).digestHex(file);
}
// ------------------------------------------------------------------------------------------- SHA-512
// endregion
// region ----- SHA-512
/**
* 计算SHA-512摘要值
@ -426,7 +436,7 @@ public class DigestUtil {
* @return SHA-512摘要
*/
public static byte[] sha512(final byte[] data) {
return new Digester(DigestAlgorithm.SHA512).digest(data);
return digester(DigestAlgorithm.SHA512).digest(data);
}
/**
@ -438,7 +448,7 @@ public class DigestUtil {
* @since 3.0.8
*/
public static byte[] sha512(final String data, final Charset charset) {
return new Digester(DigestAlgorithm.SHA512).digest(data, charset);
return digester(DigestAlgorithm.SHA512).digest(data, charset);
}
/**
@ -458,7 +468,7 @@ public class DigestUtil {
* @return SHA-512摘要
*/
public static byte[] sha512(final InputStream data) {
return new Digester(DigestAlgorithm.SHA512).digest(data);
return digester(DigestAlgorithm.SHA512).digest(data);
}
/**
@ -468,7 +478,7 @@ public class DigestUtil {
* @return SHA-512摘要
*/
public static byte[] sha512(final File file) {
return new Digester(DigestAlgorithm.SHA512).digest(file);
return digester(DigestAlgorithm.SHA512).digest(file);
}
/**
@ -478,7 +488,7 @@ public class DigestUtil {
* @return SHA-512摘要的16进制表示
*/
public static String sha512Hex(final byte[] data) {
return new Digester(DigestAlgorithm.SHA512).digestHex(data);
return digester(DigestAlgorithm.SHA512).digestHex(data);
}
/**
@ -489,7 +499,7 @@ public class DigestUtil {
* @return SHA-512摘要的16进制表示
*/
public static String sha512Hex(final String data, final Charset charset) {
return new Digester(DigestAlgorithm.SHA512).digestHex(data, charset);
return digester(DigestAlgorithm.SHA512).digestHex(data, charset);
}
/**
@ -509,7 +519,7 @@ public class DigestUtil {
* @return SHA-512摘要的16进制表示
*/
public static String sha512Hex(final InputStream data) {
return new Digester(DigestAlgorithm.SHA512).digestHex(data);
return digester(DigestAlgorithm.SHA512).digestHex(data);
}
/**
@ -519,10 +529,12 @@ public class DigestUtil {
* @return SHA-512摘要的16进制表示
*/
public static String sha512Hex(final File file) {
return new Digester(DigestAlgorithm.SHA512).digestHex(file);
return digester(DigestAlgorithm.SHA512).digestHex(file);
}
// ------------------------------------------------------------------------------------------- Hmac
// endregion
// region ----- Hmac
/**
* 创建HMac对象调用digest方法可获得hmac值
@ -548,6 +560,8 @@ public class DigestUtil {
return new HMac(algorithm, key);
}
// endregion
/**
* 新建摘要器
*

View File

@ -29,6 +29,9 @@ package org.dromara.hutool.crypto.digest;
public class SM3 extends Digester {
private static final long serialVersionUID = 1L;
/**
* 算法名称SM3
*/
public static final String ALGORITHM_NAME = "SM3";
/**

View File

@ -33,7 +33,7 @@ public class DefaultHMacEngine implements MacEngine {
private Mac mac;
// ------------------------------------------------------------------------------------------- Constructor start
// region ----- Constructor
/**
* 构造
@ -62,13 +62,15 @@ public class DefaultHMacEngine implements MacEngine {
*
* @param algorithm 算法
* @param key 密钥
* @param spec {@link AlgorithmParameterSpec}
* @param spec {@link AlgorithmParameterSpec}
* @since 5.7.12
*/
public DefaultHMacEngine(final String algorithm, final Key key, final AlgorithmParameterSpec spec) {
init(algorithm, key, spec);
}
// ------------------------------------------------------------------------------------------- Constructor end
// endregion
// region ----- init
/**
* 初始化
@ -119,6 +121,7 @@ public class DefaultHMacEngine implements MacEngine {
}
return this;
}
// endregion
/**
* 获得 {@link Mac}

View File

@ -10,11 +10,7 @@
* See the Mulan PSL v2 for more details.
*/
package org.dromara.hutool.crypto.digest;
import org.dromara.hutool.crypto.digest.mac.Mac;
import org.dromara.hutool.crypto.digest.mac.MacEngine;
import org.dromara.hutool.crypto.digest.mac.MacEngineFactory;
package org.dromara.hutool.crypto.digest.mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;

View File

@ -10,7 +10,7 @@
* See the Mulan PSL v2 for more details.
*/
package org.dromara.hutool.crypto.digest;
package org.dromara.hutool.crypto.digest.mac;
/**
* HMAC算法类型<br>
@ -19,14 +19,33 @@ package org.dromara.hutool.crypto.digest;
* @author Looly
*/
public enum HmacAlgorithm {
/**
* HmacMD5
*/
HmacMD5("HmacMD5"),
/**
* HmacSHA1
*/
HmacSHA1("HmacSHA1"),
/**
* HmacSHA256
*/
HmacSHA256("HmacSHA256"),
/**
* HmacSHA384
*/
HmacSHA384("HmacSHA384"),
/**
* HmacSHA512
*/
HmacSHA512("HmacSHA512"),
/** HmacSM3算法实现需要BouncyCastle库支持 */
/**
* HmacSM3算法实现需要BouncyCastle库支持
*/
HmacSM3("HmacSM3"),
/** SM4 CMAC模式实现需要BouncyCastle库支持 */
/**
* SM4 CMAC模式实现需要BouncyCastle库支持
*/
SM4CMAC("SM4CMAC");
private final String value;
@ -35,6 +54,11 @@ public enum HmacAlgorithm {
this.value = value;
}
/**
* 获取算法名称值
*
* @return 算法名称值
*/
public String getValue() {
return this.value;
}

View File

@ -13,13 +13,12 @@
package org.dromara.hutool.crypto.digest.mac;
import org.dromara.hutool.crypto.bc.SmUtil;
import org.dromara.hutool.crypto.digest.HmacAlgorithm;
import java.security.Key;
import java.security.spec.AlgorithmParameterSpec;
/**
* {@link MacEngine} 实现工厂类
* {@link MacEngine} 简单工厂类
*
* @author Looly
* @since 4.5.13

View File

@ -11,10 +11,16 @@
*/
/**
* <p>
* MAC全称为Message Authentication Code中文名消息鉴别码
* </p>
*
* <p>
* HMAC全称为Hash Message Authentication Code中文名散列消息鉴别码<br>
* 主要是利用哈希算法以一个密钥和一个消息为输入生成一个消息摘要作为输出<br>
* 一般的消息鉴别码用于验证传输于两个共 同享有一个密钥的单位之间的消息<br>
* HMAC 可以与任何迭代散列函数捆绑使用MD5 SHA-1 就是这种散列函数HMAC 还可以使用一个用于计算和确认消息鉴别值的密钥<br>
* HMAC 可以与任何迭代散列函数捆绑使用MD5 SHA-1 就是这种散列函数HMAC 还可以使用一个用于计算和确认消息鉴别值的密钥
* </p>
*
* @author Looly
* @since 4.5.13

View File

@ -14,8 +14,8 @@ package org.dromara.hutool.crypto.digest.otp;
import org.dromara.hutool.core.codec.binary.Base32;
import org.dromara.hutool.core.util.RandomUtil;
import org.dromara.hutool.crypto.digest.HMac;
import org.dromara.hutool.crypto.digest.HmacAlgorithm;
import org.dromara.hutool.crypto.digest.mac.HMac;
import org.dromara.hutool.crypto.digest.mac.HmacAlgorithm;
/**
* <p>HMAC-based one-time passwords (HOTP) 基于HMAC算法一次性密码生成器

View File

@ -13,7 +13,7 @@
package org.dromara.hutool.crypto.digest.otp;
import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.crypto.digest.HmacAlgorithm;
import org.dromara.hutool.crypto.digest.mac.HmacAlgorithm;
import java.time.Duration;
import java.time.Instant;

View File

@ -12,20 +12,15 @@
package org.dromara.hutool.crypto.symmetric;
import org.dromara.hutool.core.array.ArrayUtil;
import org.dromara.hutool.core.codec.HexUtil;
import org.dromara.hutool.core.io.IORuntimeException;
import org.dromara.hutool.core.io.IoUtil;
import org.dromara.hutool.core.lang.Assert;
import org.dromara.hutool.core.lang.Console;
import org.dromara.hutool.core.lang.Opt;
import org.dromara.hutool.core.array.ArrayUtil;
import org.dromara.hutool.core.codec.HexUtil;
import org.dromara.hutool.core.util.RandomUtil;
import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.crypto.CipherMode;
import org.dromara.hutool.crypto.CipherWrapper;
import org.dromara.hutool.crypto.CryptoException;
import org.dromara.hutool.crypto.KeyUtil;
import org.dromara.hutool.crypto.Padding;
import org.dromara.hutool.core.util.RandomUtil;
import org.dromara.hutool.crypto.*;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
@ -33,7 +28,10 @@ import javax.crypto.CipherOutputStream;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEParameterSpec;
import java.io.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.SecureRandom;

View File

@ -16,8 +16,7 @@ import org.dromara.hutool.core.util.CharsetUtil;
import org.dromara.hutool.crypto.KeyUtil;
import org.dromara.hutool.crypto.Mode;
import org.dromara.hutool.crypto.Padding;
import org.dromara.hutool.crypto.bc.SmUtil;
import org.dromara.hutool.crypto.digest.HMac;
import org.dromara.hutool.crypto.digest.mac.HMac;
import org.dromara.hutool.crypto.symmetric.SM4;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

View File

@ -4,6 +4,8 @@ import org.dromara.hutool.core.io.IoUtil;
import org.dromara.hutool.core.util.CharsetUtil;
import org.dromara.hutool.crypto.KeyUtil;
import org.dromara.hutool.crypto.SecureUtil;
import org.dromara.hutool.crypto.digest.mac.HMac;
import org.dromara.hutool.crypto.digest.mac.HmacAlgorithm;
import org.dromara.hutool.crypto.symmetric.ZUC;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

View File

@ -1,6 +1,7 @@
package org.dromara.hutool.crypto.digest;
import org.dromara.hutool.core.codec.binary.Base32;
import org.dromara.hutool.crypto.digest.mac.HmacAlgorithm;
import org.dromara.hutool.crypto.digest.otp.HOTP;
import org.dromara.hutool.crypto.digest.otp.TOTP;
import org.junit.jupiter.api.Assertions;

View File

@ -15,7 +15,7 @@ package org.dromara.hutool.json.jwt.signers;
import org.dromara.hutool.core.map.BiMap;
import org.dromara.hutool.core.util.ObjUtil;
import org.dromara.hutool.crypto.asymmetric.SignAlgorithm;
import org.dromara.hutool.crypto.digest.HmacAlgorithm;
import org.dromara.hutool.crypto.digest.mac.HmacAlgorithm;
import java.util.HashMap;

View File

@ -15,7 +15,7 @@ package org.dromara.hutool.json.jwt.signers;
import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.core.util.ByteUtil;
import org.dromara.hutool.core.util.CharsetUtil;
import org.dromara.hutool.crypto.digest.HMac;
import org.dromara.hutool.crypto.digest.mac.HMac;
import java.nio.charset.Charset;
import java.security.Key;