相同输入的Java不同MD5输出?
我生成md5的代码如下所示相同输入的Java不同MD5输出?,java,cryptography,md5,Java,Cryptography,Md5,我生成md5的代码如下所示 @Nonnull static String getAuthCode(@Nonnull final String email, @Nonnull final String memberExternalId, @Nonnull final String clientId, @Nonnull final String clientSecret) { final MessageDigest messageDiges
@Nonnull
static String getAuthCode(@Nonnull final String email, @Nonnull final String memberExternalId,
@Nonnull final String clientId, @Nonnull final String clientSecret) {
final MessageDigest messageDigest = getMessageDigest("MD5");
final String stringForHashCode = email + ":" + memberExternalId + ":" + clientId + ":" + clientSecret;
messageDigest.update(stringForHashCode.getBytes());
return new BigInteger(1, messageDigest.digest()).toString();
}
我以同样的方式运行测试
@Test
public void test() {
System.out.println(getAuthCode("a", "b", "c", "d"));
}
我得到的输出是
306937959255909402080036399104389354327
e6ea19c62a3763c7b78c475652c51357
当我在线运行相同的测试时,我得到的输出是
306937959255909402080036399104389354327
e6ea19c62a3763c7b78c475652c51357
对于相同的输入a:b:c:d
问题
- 为什么它们不同李>
- 如何获得类似于在线获得的输出?哪个是
e6ea19c62a3763c7b78c475652c51357
- 评论中指出的问题是一个问题-您应该定义要使用的编码。我建议使用UTF-8,例如
messageDigest.update(stringForHashCode.getBytes(StandardCharsets.UTF_8));
然而,一个更大的问题是,您正在打印一个从摘要创建的biginger
——它是以十进制打印出来的。从在线工具得到的结果是十六进制的
虽然您可以将
biginger
转换为十六进制,但我个人首先会避免创建biginger
——您需要计算填充等。相反,只需使用可用于将字节[]
转换为十六进制的众多库中的一个,例如,与它的类一起。messageDigest.update(stringForHashCode.getBytes());
不确定什么编码会给我类似于我在网上得到的结果我甚至尝试了messageDigest.update(stringForHashCode.getBytes(Charset.forName(“UTF-8”));
但结果仍然是相同的Hashing.md5()。hashString(str,UTF_8)。toString()
也打印出十六进制。