You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2026/10/26 10:35:36 UTC
(shardingsphere) branch master updated: Refactor MD5 digest input preparation (#40370)
This is an automated email from the ASF dual-hosted git repository.
terrymanu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new f0b3e2fe124 Refactor MD5 digest input preparation (#40370)
f0b3e2fe124 is described below
commit f0b3e2fe1249b9a24d0319fe26677b85a496a8e8
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Mon Oct 26 18:35:29 2026 +0800
Refactor MD5 digest input preparation (#40370)
---
.../md5/MD5MessageDigestAlgorithm.java | 7 ++++-
.../messagedigest/md5/MD5MessageDigestEngine.java | 23 ++-------------
.../md5/MD5MessageDigestAlgorithmTest.java | 34 ++++++++++++++--------
.../md5/MD5MessageDigestEngineTest.java | 12 ++------
4 files changed, 34 insertions(+), 42 deletions(-)
diff --git a/infra/algorithm/type/message-digest/type/md5/src/main/java/org/apache/shardingsphere/infra/algorithm/messagedigest/md5/MD5MessageDigestAlgorithm.java b/infra/algorithm/type/message-digest/type/md5/src/main/java/org/apache/shardingsphere/infra/algorithm/messagedigest/md5/MD5MessageDigestAlgorithm.java
index aed9a36d1e8..d1ffaa76d1c 100644
--- a/infra/algorithm/type/message-digest/type/md5/src/main/java/org/apache/shardingsphere/infra/algorithm/messagedigest/md5/MD5MessageDigestAlgorithm.java
+++ b/infra/algorithm/type/message-digest/type/md5/src/main/java/org/apache/shardingsphere/infra/algorithm/messagedigest/md5/MD5MessageDigestAlgorithm.java
@@ -18,6 +18,7 @@
package org.apache.shardingsphere.infra.algorithm.messagedigest.md5;
import lombok.SneakyThrows;
+import org.apache.shardingsphere.infra.algorithm.core.util.AlgorithmValueUtils;
import org.apache.shardingsphere.infra.algorithm.messagedigest.spi.MessageDigestAlgorithm;
import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
@@ -42,7 +43,11 @@ public final class MD5MessageDigestAlgorithm implements MessageDigestAlgorithm {
@SneakyThrows(GeneralSecurityException.class)
@Override
public byte[] digest(final Object plainValue) {
- return null == plainValue ? null : MD5MessageDigestEngine.digest(plainValue, salt);
+ if (null == plainValue) {
+ return null;
+ }
+ String plainText = AlgorithmValueUtils.convertToUTF8Text(plainValue) + salt;
+ return MD5MessageDigestEngine.digest(AlgorithmValueUtils.convertToBytes(plainText, null));
}
@Override
diff --git a/infra/algorithm/type/message-digest/type/md5/src/main/java/org/apache/shardingsphere/infra/algorithm/messagedigest/md5/MD5MessageDigestEngine.java b/infra/algorithm/type/message-digest/type/md5/src/main/java/org/apache/shardingsphere/infra/algorithm/messagedigest/md5/MD5MessageDigestEngine.java
index f4dec0218f0..529fc12a0a0 100644
--- a/infra/algorithm/type/message-digest/type/md5/src/main/java/org/apache/shardingsphere/infra/algorithm/messagedigest/md5/MD5MessageDigestEngine.java
+++ b/infra/algorithm/type/message-digest/type/md5/src/main/java/org/apache/shardingsphere/infra/algorithm/messagedigest/md5/MD5MessageDigestEngine.java
@@ -19,11 +19,9 @@ package org.apache.shardingsphere.infra.algorithm.messagedigest.md5;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
-import org.apache.shardingsphere.infra.algorithm.core.util.AlgorithmValueUtils;
import java.security.GeneralSecurityException;
import java.security.MessageDigest;
-import java.util.Properties;
/**
* MD5 message digest engine.
@@ -33,29 +31,14 @@ public final class MD5MessageDigestEngine {
private static final String MD5 = "MD5";
- private static final String SALT = "salt";
-
- /**
- * Digest value with MD5.
- *
- * @param plainValue plain value
- * @param props algorithm properties
- * @return digest bytes
- * @throws GeneralSecurityException digest failure
- */
- public static byte[] digest(final Object plainValue, final Properties props) throws GeneralSecurityException {
- return digest(plainValue, props.getProperty(SALT, ""));
- }
-
/**
* Digest value with MD5.
*
- * @param plainValue plain value
- * @param salt salt
+ * @param plainValue plain value bytes
* @return digest bytes
* @throws GeneralSecurityException digest failure
*/
- public static byte[] digest(final Object plainValue, final String salt) throws GeneralSecurityException {
- return MessageDigest.getInstance(MD5).digest(AlgorithmValueUtils.convertToBytes(AlgorithmValueUtils.convertToUTF8Text(plainValue) + salt, null));
+ public static byte[] digest(final byte[] plainValue) throws GeneralSecurityException {
+ return MessageDigest.getInstance(MD5).digest(plainValue);
}
}
diff --git a/infra/algorithm/type/message-digest/type/md5/src/test/java/org/apache/shardingsphere/infra/algorithm/messagedigest/md5/MD5MessageDigestAlgorithmTest.java b/infra/algorithm/type/message-digest/type/md5/src/test/java/org/apache/shardingsphere/infra/algorithm/messagedigest/md5/MD5MessageDigestAlgorithmTest.java
index 54ce5ddc2e6..d396374989b 100644
--- a/infra/algorithm/type/message-digest/type/md5/src/test/java/org/apache/shardingsphere/infra/algorithm/messagedigest/md5/MD5MessageDigestAlgorithmTest.java
+++ b/infra/algorithm/type/message-digest/type/md5/src/test/java/org/apache/shardingsphere/infra/algorithm/messagedigest/md5/MD5MessageDigestAlgorithmTest.java
@@ -24,8 +24,13 @@ import org.apache.shardingsphere.infra.util.props.PropertiesBuilder;
import org.apache.shardingsphere.infra.util.props.PropertiesBuilder.Property;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
import java.nio.charset.StandardCharsets;
+import java.util.Properties;
+import java.util.stream.Stream;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
@@ -40,24 +45,29 @@ class MD5MessageDigestAlgorithmTest {
digestAlgorithm = TypedSPILoader.getService(MessageDigestAlgorithm.class, "MD5");
}
- @Test
- void assertDigest() {
- assertThat(Hex.encodeHexString(digestAlgorithm.digest("test")), is("098f6bcd4621d373cade4e832627b4f6"));
+ @ParameterizedTest(name = "{0}")
+ @MethodSource("provideDigestArguments")
+ void assertDigest(final String name, final Object plainValue, final Properties props, final String expected) {
+ digestAlgorithm.init(props);
+ assertThat(Hex.encodeHexString(digestAlgorithm.digest(plainValue)), is(expected));
}
- @Test
- void assertDigestBytes() {
- assertThat(Hex.encodeHexString(digestAlgorithm.digest("test".getBytes(StandardCharsets.UTF_8))), is("098f6bcd4621d373cade4e832627b4f6"));
+ private static Stream<Arguments> provideDigestArguments() {
+ return Stream.of(
+ Arguments.of("Text without salt", "test", new Properties(), "098f6bcd4621d373cade4e832627b4f6"),
+ Arguments.of("UTF-8 bytes without salt", "test".getBytes(StandardCharsets.UTF_8), new Properties(), "098f6bcd4621d373cade4e832627b4f6"),
+ Arguments.of("Configured salt", "test", PropertiesBuilder.build(new Property("salt", "202cb962ac5907")), "0c243d2934937738f36514035d95344a"),
+ Arguments.of("Text with salt", "test", PropertiesBuilder.build(new Property("salt", "salt")), "315240c61218a4a861ec949166a85ef0"),
+ Arguments.of("Chinese text", "中文", new Properties(), "a7bac2239fcdcb3a067903d8077c4a07"),
+ Arguments.of("Chinese bytes with salt", "中文".getBytes(StandardCharsets.UTF_8), PropertiesBuilder.build(new Property("salt", "盐")), "3d4e5d6bae87398145d538c70a7ac58b"),
+ Arguments.of("Invalid UTF-8 with salt", new byte[]{(byte) 0xC3, 0x28}, PropertiesBuilder.build(new Property("salt", "salt")), "bd3cece2bc4d3c492eefa3bd788005db"),
+ Arguments.of("Surrogate pair across salt boundary", String.valueOf((char) 0xD83D), PropertiesBuilder.build(new Property("salt", String.valueOf((char) 0xDE00))),
+ "2a02eac39d716a70ecf37579185927b6"),
+ Arguments.of("Number as text", 123, new Properties(), "202cb962ac59075b964b07152d234b70"));
}
@Test
void assertDigestWithNullPlaintext() {
assertNull(digestAlgorithm.digest(null));
}
-
- @Test
- void assertDigestWhenConfigSalt() {
- digestAlgorithm.init(PropertiesBuilder.build(new Property("salt", "202cb962ac5907")));
- assertThat(Hex.encodeHexString(digestAlgorithm.digest("test")), is("0c243d2934937738f36514035d95344a"));
- }
}
diff --git a/infra/algorithm/type/message-digest/type/md5/src/test/java/org/apache/shardingsphere/infra/algorithm/messagedigest/md5/MD5MessageDigestEngineTest.java b/infra/algorithm/type/message-digest/type/md5/src/test/java/org/apache/shardingsphere/infra/algorithm/messagedigest/md5/MD5MessageDigestEngineTest.java
index 70623ef75c1..b8c7e52f421 100644
--- a/infra/algorithm/type/message-digest/type/md5/src/test/java/org/apache/shardingsphere/infra/algorithm/messagedigest/md5/MD5MessageDigestEngineTest.java
+++ b/infra/algorithm/type/message-digest/type/md5/src/test/java/org/apache/shardingsphere/infra/algorithm/messagedigest/md5/MD5MessageDigestEngineTest.java
@@ -20,8 +20,8 @@ package org.apache.shardingsphere.infra.algorithm.messagedigest.md5;
import org.apache.commons.codec.binary.Hex;
import org.junit.jupiter.api.Test;
+import java.nio.charset.StandardCharsets;
import java.security.GeneralSecurityException;
-import java.util.Properties;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
@@ -30,13 +30,7 @@ class MD5MessageDigestEngineTest {
@Test
void assertDigest() throws GeneralSecurityException {
- assertThat(Hex.encodeHexString(MD5MessageDigestEngine.digest("test", "salt")), is("315240c61218a4a861ec949166a85ef0"));
- }
-
- @Test
- void assertDigestWithProperties() throws GeneralSecurityException {
- Properties props = new Properties();
- props.setProperty("salt", "salt");
- assertThat(Hex.encodeHexString(MD5MessageDigestEngine.digest("test", props)), is("315240c61218a4a861ec949166a85ef0"));
+ assertThat(Hex.encodeHexString(MD5MessageDigestEngine.digest("testsalt".getBytes(StandardCharsets.UTF_8))), is("315240c61218a4a861ec949166a85ef0"));
+ assertThat(Hex.encodeHexString(MD5MessageDigestEngine.digest(new byte[]{(byte) 0xC3, 0x28})), is("0999cc4fa36693c7d5ab8482d6bdc367"));
}
}