[英]How can you generate the same MD5 Hashcode in C# and Java?
我有一個在C#中生成MD5哈希的函數,如下所示:
MD5 md5 = new MD5CryptoServiceProvider();
byte[] result = md5.ComputeHash(data);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < result.Length; i++)
{
sb.Append(result[i].ToString("X2"));
}
return sb.ToString();
在java中,我的函數如下所示:
MessageDigest m = MessageDigest.getInstance("MD5");
m.update(bytes,0,bytes.length);
String hashcode = new BigInteger(1,m.digest()).toString(16);
return hashcode;
當C#代碼生成:“02945C9171FBFEF0296D22B0607D522D”時,java代碼生成:“5a700e63fa29a8eae77ebe0443d59239”。
有沒有辦法為同一個bytearray生成相同的md5哈希?
一經請求:
這是java中的testcode:
File file = new File(System.getProperty("user.dir") + "/HashCodeTest.flv");
byte[] bytes = null;
try {
bytes = FileUtils.getBytesFromFile(file);
} catch (IOException e) {
fail();
}
try {
generatedHashCode = HashCode.generate(bytes);
} catch (NoSuchAlgorithmException e) {
fail();
}
這是我在C#中的代碼
var blob = GetBlobByHttpPostedFile(httpPostedFile);
var hashCode = Md5Factory.ConvertByteArray(blob);
private static byte[] GetBlobByHttpPostedFile(HttpPostedFile httpPostedFile)
{
var contentLength = httpPostedFile.ContentLength;
var result = new byte[contentLength];
var inputStream = httpPostedFile.InputStream;
inputStream.Read(result, 0, contentLength);
return result;
}
干杯
這應該沒問題 - 盡管你可以通過調用來簡化Java代碼
byte[] digest = m.digest(bytes);
而不是調用update
然后digest
。
你絕對相信你在兩種情況下都有相同的數據嗎? 您是否可以使用相同的硬編碼數據發布顯示此失敗的示例程序?
編輯:這是我想到的那種測試。 這兩個程序給出了相同的結果:
C#:
using System;
using System.Security.Cryptography;
using System.Text;
class Test
{
static void Main()
{
byte[] bytes = { 0x35, 0x24, 0x76, 0x12 };
MD5 md5 = new MD5CryptoServiceProvider();
byte[] result = md5.ComputeHash(bytes);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < result.Length; i++)
{
sb.Append(result[i].ToString("x2"));
}
Console.WriteLine(sb);
}
}
Java的:
import java.math.BigInteger;
import java.security.MessageDigest;
public class Test
{
public static void main(String[] args) throws Exception
{
byte[] bytes = { 0x35, 0x24, 0x76, 0x12 };
MessageDigest m = MessageDigest.getInstance("MD5");
byte[] digest = m.digest(bytes);
String hash = new BigInteger(1, digest).toString(16);
System.out.println(hash);
}
}
嗨,我使用此代碼,它的工作原理
C#代碼:
public static string ConvertStringToMD5(string ClearText)
{
byte[] ByteData = Encoding.ASCII.GetBytes(ClearText);
//MD5 creating MD5 object.
MD5 oMd5 = MD5.Create();
//Hash değerini hesaplayalım.
byte[] HashData = oMd5.ComputeHash(ByteData);
//convert byte array to hex format
StringBuilder oSb = new StringBuilder();
for (int x = 0; x < HashData.Length; x++)
{
//hexadecimal string value
oSb.Append(HashData[x].ToString("x2"));
}
和Java代碼:
private String getMD5Digest(byte[] buffer) {
String resultHash = null;
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] result = new byte[md5.getDigestLength()];
md5.reset();
md5.update(buffer);
result = md5.digest();
StringBuffer buf = new StringBuffer(result.length * 2);
for (int i = 0; i < result.length; i++) {
int intVal = result[i] & 0xff;
if (intVal < 0x10) {
buf.append("0");
}
buf.append(Integer.toHexString(intVal));
}
resultHash = buf.toString();
} catch (NoSuchAlgorithmException e) {
}
return resultHash;
}
我遇到了類似的問題,我們使用Java MD5 Hash來確定文件是否已被處理。 我們發現我們無法使用.NET庫創建相同的哈希。 我嘗試了以上所有建議,遺憾的是它不適合我。
我后來發現的解決方案是:我們不是在.NET中創建類似的函數,而是直接在.NET中調用Java函數。 有一個很棒的開源項目叫Ja.NET。 基本上我所做的是:創建一個使用相同代碼創建哈希的Java類。 使用Ja.NET javac編譯它。 然后使用bam將生成的Java類文件編譯成DLL並在我的.NET項目中使用它。
我知道這個話題已經過時但我剛剛遇到了同樣的問題,找不到適合我的答案。 我正在為游戲編寫一個修補程序,並且需要文件的md5
hashcode
作為確保文件是最新的方式,但是C#和Java給了我不同的字符串,盡管文件是相同的。
這是我解決它的方式:
C#代碼:
public static string getMD5(string fullPath)
{
MD5 md5 = MD5.Create();
using (FileStream stream = new FileStream(fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
byte[] hash = md5.ComputeHash(stream);
StringBuilder sb = new StringBuilder();
for (int j = 0; j < hash.Length; j++)
{
sb.Append(hash[j].ToString("X2"));
}
return sb.ToString();
}
}
這將創建一個32個字符的十六進制字 Apache Commons
DigestUtils.md5Hex(InputStream)
也是如此,現在唯一不同的是C#示例返回一個大寫字符串,因此解決方案只是將Java程序中的哈希轉換為大寫字符串。
Java代碼:
public static String checkSumApacheCommons(String filePath)
{
String checksum = null;
try
{
checksum = DigestUtils.md5Hex(new FileInputStream(filePath));
}
catch (IOException ex)
{
ex.printStackTrace(System.out);
}
return checksum.toUpperCase();
}
生產的哈希看起來像F674865D8A44695A2443017CFA2B0C67
。
希望這有助於某人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.