2013-03-05 81 views
0

我想獲得字符串"password"的MD5散列。消息摘要散列MD5

當我使用從Spring框架MD5PasswordEncoder類我得到這個:

5f4dcc3b5aa765d61d8327deb882cf99

但是,當我使用Java的MessageDigest類MD5我得到這個:

9577-525990-89101-4229-12539-34-72-126-49-103

第一個是十六進制,另一個是十進制。爲什麼有差異?這裏是代碼:

public static void main(String[] args) { 
    PasswordEncoder pEncoder = new Md5PasswordEncoder(); 
    System.out.println(pEncoder.encodePassword("password", null)); 

    try { 
     MessageDigest md = MessageDigest.getInstance("MD5"); 
     md.update("password".getBytes("UTF-8")); 
     byte [] digest = md.digest(); 
     StringBuffer sb = new StringBuffer(); 
     for (byte b : digest) { 
      sb.append(b); 
     } 
     System.out.println(sb.toString()); 

    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } catch (UnsupportedEncodingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
+1

我想你錯過了添加一個問題。如果問題是他們爲什麼不同,我的答案是:你讀過這兩個類的文檔嗎? – Augusto 2013-03-05 08:37:18

+0

除了值非常不同之外,還有什麼問題? – 2013-03-05 08:37:23

+0

是的問題是他們爲什麼不同。 – George 2013-03-05 08:42:04

回答

4

問題是您的打印功能。下面的代碼打印相同的值作爲你的Spring應用程序:

public static void main(String[] args) { 

    try { 
    MessageDigest md = MessageDigest.getInstance("MD5"); 
    md.update("password".getBytes("UTF-8")); 
    byte[] digest = md.digest(); 
    System.out.println(DatatypeConverter.printHexBinary(digest)); 

    } catch (NoSuchAlgorithmException e) { 
    e.printStackTrace(); 
    } catch (UnsupportedEncodingException e) { 
    e.printStackTrace(); 
    } 
} 

打印:

5F4DCC3B5AA765D61D8327DEB882CF99

1

嘗試

for (byte b : digest) { 
     sb.append(String.format("%02x", b)); 
    } 

你會得到

5f4dcc3b5aa765d61d8327deb882cf99 
0

問題的關鍵在於如何將Java MessageDigest的輸出轉換爲字符串。

嘗試

System.out.print(new String(org.springframework.security.crypto.codec.Hex.encode(digest))); 

到字節轉換爲十六進制。