[英]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==
相同
DigestUtils
和Base64Utils
是Spring庫中MD5
和BAS64
一些實現
事實證明,主要區別沒有出現在我的原始代碼片段中-它是從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.