diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/digest/HMac.java b/hutool-crypto/src/main/java/cn/hutool/crypto/digest/HMac.java index 974f021bd..85a0ecb83 100644 --- a/hutool-crypto/src/main/java/cn/hutool/crypto/digest/HMac.java +++ b/hutool-crypto/src/main/java/cn/hutool/crypto/digest/HMac.java @@ -15,6 +15,7 @@ import java.io.File; import java.io.InputStream; import java.io.Serializable; import java.security.Key; +import java.security.MessageDigest; /** * HMAC摘要算法
@@ -28,9 +29,9 @@ import java.security.Key; */ public class HMac implements Serializable { private static final long serialVersionUID = 1L; - + private final MacEngine engine; - + // ------------------------------------------------------------------------------------------- Constructor start /** * 构造,自动生成密钥 @@ -39,7 +40,7 @@ public class HMac implements Serializable { public HMac(HmacAlgorithm algorithm) { this(algorithm, (Key)null); } - + /** * 构造 * @param algorithm 算法 {@link HmacAlgorithm} @@ -48,7 +49,7 @@ public class HMac implements Serializable { public HMac(HmacAlgorithm algorithm, byte[] key) { this(algorithm.getValue(), key); } - + /** * 构造 * @param algorithm 算法 {@link HmacAlgorithm} @@ -57,7 +58,7 @@ public class HMac implements Serializable { public HMac(HmacAlgorithm algorithm, Key key) { this(algorithm.getValue(), key); } - + /** * 构造 * @param algorithm 算法 @@ -67,7 +68,7 @@ public class HMac implements Serializable { public HMac(String algorithm, byte[] key) { this(algorithm, new SecretKeySpec(key, algorithm)); } - + /** * 构造 * @param algorithm 算法 @@ -77,7 +78,7 @@ public class HMac implements Serializable { public HMac(String algorithm, Key key) { this(MacEngineFactory.createEngine(algorithm, key)); } - + /** * 构造 * @param engine MAC算法实现引擎 @@ -87,11 +88,11 @@ public class HMac implements Serializable { this.engine = engine; } // ------------------------------------------------------------------------------------------- Constructor end - + // ------------------------------------------------------------------------------------------- Digest /** * 生成文件摘要 - * + * * @param data 被摘要数据 * @param charset 编码 * @return 摘要 @@ -99,20 +100,20 @@ public class HMac implements Serializable { public byte[] digest(String data, String charset) { return digest(StrUtil.bytes(data, charset)); } - + /** * 生成文件摘要 - * + * * @param data 被摘要数据 * @return 摘要 */ public byte[] digest(String data) { return digest(data, CharsetUtil.UTF_8); } - + /** * 生成文件摘要,并转为16进制字符串 - * + * * @param data 被摘要数据 * @param charset 编码 * @return 摘要 @@ -120,21 +121,21 @@ public class HMac implements Serializable { public String digestHex(String data, String charset) { return HexUtil.encodeHexStr(digest(data, charset)); } - + /** * 生成文件摘要 - * + * * @param data 被摘要数据 * @return 摘要 */ public String digestHex(String data) { return digestHex(data, CharsetUtil.UTF_8); } - + /** * 生成文件摘要
* 使用默认缓存大小,见 {@link IoUtil#DEFAULT_BUFFER_SIZE} - * + * * @param file 被摘要文件 * @return 摘要bytes * @throws CryptoException Cause by IOException @@ -148,52 +149,52 @@ public class HMac implements Serializable { IoUtil.close(in); } } - + /** * 生成文件摘要,并转为16进制字符串
* 使用默认缓存大小,见 {@link IoUtil#DEFAULT_BUFFER_SIZE} - * + * * @param file 被摘要文件 * @return 摘要 */ public String digestHex(File file) { return HexUtil.encodeHexStr(digest(file)); } - + /** * 生成摘要 - * + * * @param data 数据bytes * @return 摘要bytes */ public byte[] digest(byte[] data) { return digest(new ByteArrayInputStream(data), -1); } - + /** * 生成摘要,并转为16进制字符串
- * + * * @param data 被摘要数据 * @return 摘要 */ public String digestHex(byte[] data) { return HexUtil.encodeHexStr(digest(data)); } - + /** * 生成摘要,使用默认缓存大小,见 {@link IoUtil#DEFAULT_BUFFER_SIZE} - * + * * @param data {@link InputStream} 数据流 * @return 摘要bytes */ public byte[] digest(InputStream data) { return digest(data, IoUtil.DEFAULT_BUFFER_SIZE); } - + /** * 生成摘要,并转为16进制字符串
* 使用默认缓存大小,见 {@link IoUtil#DEFAULT_BUFFER_SIZE} - * + * * @param data 被摘要数据 * @return 摘要 */ @@ -203,7 +204,7 @@ public class HMac implements Serializable { /** * 生成摘要 - * + * * @param data {@link InputStream} 数据流 * @param bufferLength 缓存长度,不足1使用 {@link IoUtil#DEFAULT_BUFFER_SIZE} 做为默认值 * @return 摘要bytes @@ -211,11 +212,11 @@ public class HMac implements Serializable { public byte[] digest(InputStream data, int bufferLength) { return this.engine.digest(data, bufferLength); } - + /** * 生成摘要,并转为16进制字符串
* 使用默认缓存大小,见 {@link IoUtil#DEFAULT_BUFFER_SIZE} - * + * * @param data 被摘要数据 * @param bufferLength 缓存长度,不足1使用 {@link IoUtil#DEFAULT_BUFFER_SIZE} 做为默认值 * @return 摘要 @@ -224,6 +225,20 @@ public class HMac implements Serializable { return HexUtil.encodeHexStr(digest(data, bufferLength)); } + /** + * 验证生成的摘要与给定的摘要比较是否一致
+ * 简单比较每个byte位是否相同 + * + * @param digest 生成的摘要 + * @param digestToCompare 需要比较的摘要 + * @return 是否一致 + * @since 5.6.8 + * @see MessageDigest#isEqual(byte[], byte[]) + */ + public boolean verify(byte[] digest, byte[] digestToCompare){ + return MessageDigest.isEqual(digest, digestToCompare); + } + /** * 获取MAC算法块长度 * @return MAC算法块长度 diff --git a/hutool-json/src/main/java/cn/hutool/json/jwt/Claims.java b/hutool-json/src/main/java/cn/hutool/json/jwt/Claims.java index 0a14e7bac..86020fddc 100644 --- a/hutool-json/src/main/java/cn/hutool/json/jwt/Claims.java +++ b/hutool-json/src/main/java/cn/hutool/json/jwt/Claims.java @@ -1,11 +1,9 @@ package cn.hutool.json.jwt; import cn.hutool.core.lang.Assert; -import cn.hutool.json.JSONUtil; +import cn.hutool.json.JSONObject; import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; /** * Claims 认证 @@ -15,14 +13,14 @@ import java.util.Map; public class Claims implements Serializable { private static final long serialVersionUID = 1L; - private final Map claimMap; + private final JSONObject claimJSON; public Claims() { - this.claimMap = new HashMap<>(); + this.claimJSON = new JSONObject(); } /** - * 增加Claims属性 + * 增加Claims属性,如果属性值为{@code null},则移除这个属性 * * @param name 属性名 * @param value 属性值 @@ -30,19 +28,10 @@ public class Claims implements Serializable { protected void setClaim(String name, Object value) { Assert.notNull(name, "Name must be not null!"); if (value == null) { - claimMap.remove(name); + claimJSON.remove(name); return; } - claimMap.put(name, value); - } - - /** - * 获取Claims数据Map - * - * @return map - */ - protected Map getClaimMap() { - return this.claimMap; + claimJSON.set(name, value); } /** @@ -51,6 +40,6 @@ public class Claims implements Serializable { * @return JSON字符串 */ public String getClaimsJson() { - return JSONUtil.toJsonStr(getClaimMap()); + return this.claimJSON.toString(); } } diff --git a/hutool-json/src/main/java/cn/hutool/json/jwt/JWT.java b/hutool-json/src/main/java/cn/hutool/json/jwt/JWT.java index ef7281c84..d7090b58f 100644 --- a/hutool-json/src/main/java/cn/hutool/json/jwt/JWT.java +++ b/hutool-json/src/main/java/cn/hutool/json/jwt/JWT.java @@ -1,13 +1,15 @@ package cn.hutool.json.jwt; import cn.hutool.core.codec.Base64; +import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.jwt.signers.JWTSigner; import java.nio.charset.Charset; /** * JSON Web Token (JWT),基于JSON的开放标准((RFC 7519)用于在网络应用环境间传递声明。
- * + *

* 结构:xxxxx.yyyyy.zzzzz *