У меня есть некоторый код .net, который генерирует хеш SHA1 для XML-документа, и мне нужно, чтобы он соответствовал хешу SHA1, сгенерированному в том же XML-документе в Java-коде. Документ xml отправляется в систему java, и они генерируют хэш и сопоставляют его с тем, который я отправляю, чтобы убедиться, что они получают документ, для которого я предназначил их. Ниже приведены фрагменты, используемые для этого, и они оба последовательно генерируют одни и те же разные хэши. Любые идеи, почему следующий код не будет генерировать тот же хэш?
.NET
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();
Java
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());
UPDATE:
Как приблизиться к решению. Я обнаружил, что в документе есть символ, который интерпретируется в java иначе, чем в коде .net.
Java читает в этом:
value="21.9456" unit="kg/m²"
.net читает в этом:
value="21.9456" unit="kg/m²"
Если я открою в редакторе xml по своему выбору, это будет похоже на то, что читает .net. Я подозреваю, что это как-то связано с java, выполняющим преобразование, и .net просто предполагающим ..