簡體   English   中英

Java和C#之間不同的MD5

[英]Different MD5 between Java and C#

我想比較來自同一文件的MD5哈希。 該文件通過Android上的HTTP POST以byte []的形式發送,在這里我也計算哈希值,並從.NET服務器接收,在其中我再次計算哈希值,然后想比較它們。

問題是對於同一文件,我得到不同的哈希值...

Java代碼

FileInputStream fileInputStream = null;

byte[] bFile = new byte[(int) file.length()];

try {

    fileInputStream = new FileInputStream(file);
    fileInputStream.read(bFile);

} catch (Exception e) {
    e.printStackTrace();
}

try {
    MessageDigest md = MessageDigest.getInstance("MD5");

    int read = 0;
    while((read = fileInputStream.read(bFile)) != -1) {
        md.update(bFile, 0, read);
    }
    fileInputStream.close();

    byte[] mdBytes = md.digest();

    StringBuffer sb = new StringBuffer();
    for(int i=0; i < mdBytes.length; ++i) {
        sb.append(Integer.toString((mdBytes[i] & 0xff) + 0x100, 16).substring(1));
    }

    // generated MD5 is d41d8cd98f00b204e9800998ecf8427e


} catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

C#代碼

using (var md5 = MD5.Create())
{
    using (var stream = File.OpenRead(filePath))
    {
        string hexString = ToHex(md5.ComputeHash(stream), false);

        // Generated MD5 is d167df114a478809ef71fb7e10c40f8c
    }
}

public string ToHex(byte[] bytes, bool upperCase)
{
    StringBuilder result = new StringBuilder(bytes.Length * 2);

    for (int i = 0; i < bytes.Length; i++)
        result.Append(bytes[i].ToString(upperCase ? "X2" : "x2"));

    return result.ToString();
}

UPDATE

我試圖將Java代碼更改為

StringBuffer sb = new StringBuffer();
for(int i=0; i < mdBytes.length; ++i) {
    sb.append(String.format("%02x", mdBytes[i]));
}

結果總是一樣的...

首先,通過使用許多免費可用工具中的一個(或多個)來計算MD5哈希值,並查看您的C#或Java代碼是否正確(可能都是錯誤的,可以:-),將工作量減少一半。

然后,我們將看到。

更新:

在Java情況下,您正在將數據讀取到字節數組中。 之后,您將使用相同的流(已經是EOF),因此永遠不要調用md.update

更新2:

所以寫

[...]
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(bFile, 0 , bFile.length);
byte[] mdBytes = md.digest();
[...]

和你基本上很好。 順便說一句,將字節數組轉換為十六進制字符串的有趣技術... :-)盡管您可能希望尋找一種更好的方法...

讀取文件流后,必須返回到流的開頭才能正確計算哈希。

暫無
暫無

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

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