Java不同的MD5输出用于相同的输入?

时间:2015-01-01 20:48:45

标签: 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 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

当我在在线website上运行相同的测试时,我得到输出为

e6ea19c62a3763c7b78c475652c51357 

对于相同的输入a:b:c:d

问题

  • 为什么他们不一样?
  • 如何获得类似于我上网的输出?这是e6ea19c62a3763c7b78c475652c51357

1 个答案:

答案 0 :(得分:3)

注释中指出的问题是问题 - 您应该定义要使用的编码。我建议使用UTF-8,例如

messageDigest.update(stringForHashCode.getBytes(StandardCharsets.UTF_8));

更大的问题是,您要打印出从摘要中创建的BigInteger - 这是以十进制打印出来的。您从在线工具获得的结果是十六进制

虽然您可以将BigInteger转换为十六进制,但我个人会首先避免创建BigInteger - 您需要计算填充等。相反,只需使用其中一个许多库可用于将byte[]转换为十六进制,例如Apache Commons Codec及其Hex类。