2013-03-10 70 views
1

我試圖將字符串列表中的兩個字符串轉換爲MD5消息摘要。MD5 Message Digest Java

我的字符串列表被稱爲「usernamepassword」。

try { 
      MessageDigest mdg = MessageDigest.getInstance("MD5");  

      mdg.update(usernamepassword.get(0).getBytes(), 0, usernamepassword.get(0).length()); 
      mdg.update(usernamepassword.get(1).getBytes(), 1, usernamepassword.get(0).length());  


     } catch (NoSuchAlgorithmException ex) { 
      Logger.getLogger(UPCheck.class.getName()).log(Level.SEVERE, null, ex); 
     } 

我的問題是 -

答:是這樣做的正確方法是什麼? B:我如何返回它,以便我可以在另一個類中使用每個單獨的MD5哈希值?

+0

您應該使用bcrypt或scrypt或PBKDFv2。 – SLaks 2013-03-10 20:11:24

回答

4

A:那是正確的做法嗎?

否,原因有四:

1)你正在使用的不是指定特定的編碼默認的字符編碼。我建議使用UTF-8。

2)您目前正在使用字符字符串的長度指定字節使用多少

3)如果你想單獨消化(每串一個),你應該使用單獨的MessageDigest每個實例,調用reset之間的調用

4)你實際上沒有對摘要做任何事情。

我建議你抽取「的字符串的MD5在一個特定的編碼」成一個單獨的方法:

public static byte[] getMd5OfUtf8(String text) { 
    try { 
     MessageDigest digest = MessageDigest.getInstance("MD5");  
     return digest.digest(text.getBytes("UTF-8")); 
    } catch (NoSuchAlgorithmException ex) { 
     throw new RuntimeException("No MD5 implementation? Really?"); 
    } catch (UnsupportedEncodingException ex) { 
     throw new RuntimeException("No UTF-8 encoding? Really?"); 
    } 
} 

然後就可以調用它的每個你感興趣列表元素的 - 這不是清除你想要事後的摘要,但你可能希望他們分開...

編輯:正如在評論中指出的,MD5真的不是一個偉大的哈希選擇這些天。類似SHA-256的鹽會是更好,但對於真正安全的應用程序,您應該閱讀一些有關該主題的現代文獻。 (我不是專家,所以不想聽起來太權威。)

+1

5)您正在使用MD5,一種具有已知漏洞的算法,快速輸出並且沒有鹽,用於密碼 – SLaks 2013-03-10 20:10:26

+0

謝謝@JonSkeet - 將更多地讀入它。我跟着幾個Youtube視頻,但他們似乎讓我誤入歧途。 – 2013-03-10 20:12:00

+0

@SLaks - 由於該程序不會發布,所以我不會太費心使用哪種加密方法。但是,謝謝你的頭! – 2013-03-10 20:12:48

1

使用apache公共類中的DigestUtils類。幾種實用方法將幫助你計算/顯示一個md5或其他一些常見的散列函數。