2012-12-23 43 views
0

我有我需要計算和檢查我的Java客戶端的UTF-8 hash_file的輸出。根據hash_file manual我提取文件的內容並在Java上創建MD5哈希十六進制,但我無法使它們匹配。我嘗試了[這個問題]的建議,但沒有成功2比較PHP hash_file與Java輸出

以下是我做的關於Java:

public static String calculateStringHash(String text, String encoding) 
     throws NoSuchAlgorithmException, UnsupportedEncodingException{ 
    MessageDigest md = MessageDigest.getInstance("MD5"); 
    return getHex(md.digest(text.getBytes(encoding))); 
} 

我的結果從this page匹配的。

例如:

字符串傑克:1200cf8ad328a60559cf5e7c5f46ee6d

從我的Java代碼:1200CF8AD328A60559CF5E7C5F46EE6D

但在文件試圖當它不工作。這裏是文件功能的代碼:

public static String calculateHash(File file) throws NoSuchAlgorithmException, 
      FileNotFoundException, IOException { 
     BufferedReader br = null; 
     StringBuilder sb = new StringBuilder(); 
     try { 
      String sCurrentLine; 
      br = new BufferedReader(new FileReader(file)); 
      while ((sCurrentLine = br.readLine()) != null) { 
       sb.append(sCurrentLine); 
      } 
     } catch (IOException ex) { 
      LOG.log(Level.SEVERE, null, ex); 
     } finally { 
      try { 
       if (br != null) { 
        br.close(); 
       } 
      } catch (IOException ex) { 
       LOG.log(Level.SEVERE, null, ex); 
      } 
     } 
     return calculateStringHash(sb.toString(),"UTF-8"); 
    } 

我驗證了在PHP端使用hash_file和UTF-8是加密。有任何想法嗎?

+0

UTF-8是[編碼](http://en.wikipedia.org/wiki/Character_encoding),不是加密。 – Gumbo

回答

3

您的閱讀方法刪除文件中所有行的結尾。 readLine()返回一行,而不包含其行終止符。打印StringBuilder的內容,你就會明白這個問題。

此外,散列算法是一種二元運算。它對字節進行操作,並返回字節。爲什麼要將文件中的字節轉換爲字符串,以便稍後將字符串轉換回字節數組以便對其進行散列。只需使用InputStream將該文件作爲字節數組讀取,而不是將其作爲字符串讀取。然後散列這個字節數組。這也將避免使用錯誤的文件編碼(您的代碼使用平臺默認編碼,這可能不是用於創建文件的編碼)。

+0

這部分答案。對於我使用的代碼看到這個問題:http://stackoverflow.com/questions/5297552/calculate-md5-hash-of-a-zip-file-in-java-program – javydreamercsw

1

我想你錯過了從文件中的新行字符,因爲你打電話br.readLine()

最好將文件讀入字節數組,並將其傳遞到md.digest(...)