簡體   English   中英

Java不同的MD5輸出用於相同的輸入?

[英]Java Different MD5 output for same input?

我生成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

當我在在線網站上運行相同的測試時,我得到輸出為

e6ea19c62a3763c7b78c475652c51357 

對於相同的輸入a:b:c:d

  • 他們為什么不同?
  • 如何獲得類似於我上網的輸出? 哪個是e6ea19c62a3763c7b78c475652c51357

注釋中指出的問題一個問題 - 您應該定義要使用的編碼。 我建議使用UTF-8,例如

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

然而,一個更大的問題是你打印出一個從摘要創建的BigInteger - 它以十進制形式打印出來。 您從在線工具獲得的結果是十六進制

雖然您可以將BigInteger轉換為十六進制,但我個人會首先避免創建一個BigInteger - 您需要計算填充等。相反,只需使用許多可用於將byte[]轉換為十六進制的庫中的一個,例如Apache Commons Codec及其Hex類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM