2010-09-03 311 views
1

我有一些.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簡單地假設..

+1

您可以共享由.NET和Java版本生成的字符串嗎?另外,我看到您的Java版本將字符串轉換爲UTF-8以獲取字節序列,但是您的.NET版本只是假定文件中的內容具有與某些內存字符串轉換爲UTF-8相同的字節序列表示。什麼是文件的編碼? – seh 2010-09-03 23:16:55

+0

已更新原始文章。 – Tone 2010-09-03 23:58:09

+1

獲取您生成的輸出XML字符串並運行diff。我敢打賭,輸出是不同的 – TheLQ 2010-09-04 02:23:19

回答

0

我有以下的java代碼:

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

,我又把它轉換成C#如下:

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

爲了得到我的哈希值進行匹配,我做包括下面的代碼,你在你的例子有:

string hex = BitConverter.ToString(hashBytes); 
hex = hex.Replace("-", "").ToLower();