我有一些.net代码,它在xml文档上生成SHA1哈希,并且需要它匹配在java代码中的同一个xml文档上生成的SHA1哈希。 xml文档被发送到java系统,它们生成一个散列并与我发送的一个匹配,以验证他们正在获取我希望他们访问的文档。下面是用于此的片段,它们都始终生成相同的不同哈希值。任何想法为什么下面的代码不会生成相同的散列?Java MessageDigest和.NET SHA1Managed - 哈希不匹配
.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
输入是被这里创造了一个UTF-8编码的CDA文件:
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简单地假设..
您可以共享由.NET和Java版本生成的字符串吗?另外,我看到您的Java版本将字符串转换为UTF-8以获取字节序列,但是您的.NET版本只是假定文件中的内容具有与某些内存字符串转换为UTF-8相同的字节序列表示。什么是文件的编码? – seh 2010-09-03 23:16:55
已更新原始文章。 – Tone 2010-09-03 23:58:09
获取您生成的输出XML字符串并运行diff。我敢打赌,输出是不同的 – TheLQ 2010-09-04 02:23:19