[英]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.