Java MessageDigest и .NET SHA1Managed — хэши не совпадают

У меня есть код .net, который генерирует хэш SHA1 в документе xml, и ему нужно, чтобы он соответствовал хэшу SHA1, сгенерированному в том же документе xml в коде java. Документ xml отправляется в систему java, и они генерируют хэш и сопоставляют его с тем, который я отправляю, чтобы убедиться, что они получают документ, который я им предназначал. Ниже приведены фрагменты, используемые для этого, и оба они последовательно генерируют одни и те же разные хэши. Любые идеи, почему следующий код не будет генерировать тот же хэш?

.СЕТЬ

    String fileName = @"D:\Projects\CHIEP\hasherror\cdadoc.xml";
    byte[] buff = null;
    FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
    BinaryReader br = new BinaryReader(fs);
    long numBytes = new FileInfo(fileName).Length;
    buff = br.ReadBytes((int)numBytes);

    HashAlgorithm hash = new SHA1Managed();
    byte[] hashBytes = hash.ComputeHash(buff);
    string hex = BitConverter.ToString(hashBytes);
    hex = hex.Replace("-", "").ToLower();

Ява

public static String SHA1(String text) throws NoSuchAlgorithmException, UnsupportedEncodingException {
    MessageDigest md;
    md = MessageDigest.getInstance("SHA-1");
    byte[] sha1hash = new byte[40];
    md.update(text.getBytes("UTF-8"), 0, text.length());
    sha1hash = md.digest();
    //String converted = convertToHex(sha1hash);
    String converted = getHexString(sha1hash);
    return converted;
}

Вывод .NET
587691443778c1da54c3fd04bb35ec68a5a7fecd

Вывод Java:
89665a8268d7d1901aba529dc8c9cea0f910c1bd

Ввод представляет собой документ CDA в кодировке UTF-8, который создается здесь:

    XmlSerializer serializer = new XmlSerializer(obj.GetType());            
    System.IO.MemoryStream memoryStream = new System.IO.MemoryStream();
    XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, new UTF8Encoding(false));
    XmlDocument xmlDoc = new XmlDocument();
    serializer.Serialize(xmlTextWriter, obj);
    memoryStream = (System.IO.MemoryStream)xmlTextWriter.BaseStream;
    String xml = UTF8Encoding.UTF8.GetString(memoryStream.ToArray());

ОБНОВИТЬ:

Приближаемся к решению. Я обнаружил, что в документе есть символ, который в java интерпретируется иначе, чем в коде .net.

Java читает в этом:

value="21.9456" unit="kg/m²"

.net читает в этом:

value="21.9456" unit="kg/m²"

Если я открою в редакторе xml по своему выбору, это будет похоже на то, что читает .net. Я подозреваю, что это как-то связано с преобразованием java, а .net просто предполагает..


person Tone    schedule 03.09.2010    source источник
comment
Можете ли вы поделиться строками, созданными версиями .NET и Java? Кроме того, я вижу, что ваша версия Java преобразует строку в UTF-8, чтобы получить последовательность байтов, но ваша версия .NET просто предполагает, что содержимое файла имеет ту же последовательность байтов, что и некоторая строка в памяти, преобразованная в UTF-8. представление. Какая кодировка у файла?   -  person seh    schedule 04.09.2010
comment
Возьмите полученную XML-строку, которую вы сгенерировали, и запустите сравнение. Я уверен, что выход другой   -  person TheLQ    schedule 04.09.2010
comment
@seh, я думаю, ты прав... разбираешься в этом..   -  person Tone    schedule 07.09.2010


Ответы (1)


У меня был следующий код Java:

MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] digest = md.digest(password);

и я преобразовал его в С# следующим образом:

var sha1 = SHA1Managed.Create();
byte[] outputBytes = sha1.ComputeHash(password);

Чтобы мои хэши совпадали, я НЕ включил следующий код, который был в вашем примере:

string hex = BitConverter.ToString(hashBytes);
hex = hex.Replace("-", "").ToLower();
person John    schedule 24.04.2013