簡體   English   中英

如何在Java中獲得與C#中相同的MD5字符串

[英]How to get the same MD5 string in Java as in C#

我在C#中有代碼,該代碼從String生成MD5編碼的byte[] ,然后將此byte[]轉換為String C#代碼是

byte[] valueBytes = (new UnicodeEncoding()).GetBytes(value);
byte[] newHash = (new MD5CryptoServiceProvider()).ComputeHash(valueBytes);

我需要在Java中獲得相同的結果。 我正在嘗試這樣做

Charset utf16 = Charset.forName("UTF-16");
return new String(DigestUtils.md5(value.getBytes(utf16)), utf16);

該代碼使用Apache Commons Codec庫進行MD5計算。 我正在使用UTF16字符集,因為我在其他SO問題中讀到了C#的UnicodeEncoding默認使用它。

因此,代碼片段看起來像是在做同樣的事情,但是當我傳遞字符串byndyusoft2014 ,C#給我hV7u6mQYRgBXXF9jOWWYJg==而Java給我﹡둛뭶魙ꇥ늺ꢑ 我已經嘗試過UTF16LE和UTF16BE作為字符集,但是沒有運氣。

有誰知道我在做什么錯?

我認為是因為Java使用utf-8將字符串解碼為byte [],但C#卻不是。所以Java和C#對不同的字節數組進行編碼,然后得到不同的結果。您可以將字符串解碼為byte []在C#中使用utf-8,然后查看結果。例如以下代碼:

UTF8Encoding utf8 = new UTF8Encoding();
byte[] bytes=utf8.GetBytes("byndyusoft2014");
byte[] en=(new MD5CryptoServiceProvider()).ComputeHash(bytes);
Console.WriteLine(Convert.ToBase64String(en));

和Java代碼:

    byte[] en = DigestUtils.md5Digest("byndyusoft2014".getBytes());
    byte[] base64 = Base64Utils.encode(en);
    System.out.println(new String(base64));

當然,在您的描述中,C#的結果就像使用base64進行編碼,因此Java應該使用base64對字節數組進行編碼。 它們的結果與swPvmbGDI1GbPKQwL9knjQ==相同

DigestUtilsBase64Utils是Spring庫中MD5BAS64一些實現

事實證明,主要區別沒有出現在我的原始代碼片段中-它是從MD5編碼的byte[]String 您需要使用Base64以獲得最終結果。 這是Java中的工作代碼段

Charset utf16 = Charset.forName("UTF-16LE");
return new String(Base64.encodeBase64(DigestUtils.md5(value.getBytes(utf16))));

使用此代碼,我得到的結果與使用C#相同。 謝謝大家的好提示!

暫無
暫無

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

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