2010-05-18 71 views
1

我有這個函數用於加密Java中的密碼,但不知何故,當我呼叫 MessageDigest時,即使我用相同的密碼調用它,它每次都會返回不同的結果。我想知道我是否以某種方式錯誤地初始化了它。Java MessageDigest結果不保持不變

public String encrypt (String password) { 
    MessageDigest md = MessageDigest.getInstance("SHA-1"); 
    md.reset();  
    md.update(password.getBytes(Charset.forName("utf-8")),0,password.length()); 
    String res = md.digest().toString(); 
} 

回答

1

byte[].toString()方法是.digest()返回值只是給你數組的表示不是其內容。關於如何將字節數組轉換爲十六進制字符串,請參閱this answer

另一種方法是使用Arrays.toString(byte[]),雖然這可能不會給你你想要的格式。

+1

究竟'md.digest()toString'無關與字節數組的內容。只是它的對象表示。替代方案 'StringBuffer hexString = new StringBuffer(); (int i = 0,i 2010-05-18 15:20:12

1

你可以改變方法簽名:

public byte[] encrypt (String password) { 
    MessageDigest md = MessageDigest.getInstance("SHA-1"); 
    md.reset(); 
    md.update(password.getBytes(Charset.forName("utf-8")), 0, password.length()); 
    return md.digest(); 
} 

...並使用Arrays.equals(byte[], byte[])比較摘要。

3

這個簡單的代碼產生三個不同的結果:

MessageDigest digest = MessageDigest.getInstance("MD5"); 
    System.out.println("test1 "); 
    System.out.println(digest.digest("test".getBytes("UTF-8"))); 

    Thread.sleep(10000);   
    System.out.println("test2 "); 
    System.out.println(digest.digest("test".getBytes("UTF-8"))); 

    Thread.sleep(10000); 
    System.out.println("test3 "); 
    System.out.println(digest.digest("test".getBytes("UTF-8"))); 
+1

與SHA-1摘要相同的行爲,非常囉嗦...它應該是不變的,不是嗎? – Meex 2011-08-22 13:31:43

+0

'digest()'函數返回一個'byte []'。當運行三次時,它返回三個不同的字節數組引用,但它們包含相同的摘要字節。您可以通過打印出字節數組的十六進制字符串來驗證,而不是數組引用本身。 – 2015-10-25 17:37:57