2011-10-04 120 views
2

我不能讓消息摘要的工作,該計劃讓我的兩個錯誤: UnsupportedEncodingException,拋出:NoSuchAlgorithmException的Java消息摘要不起作用

byte[] bytesOfchat_key = "lol".getBytes("UTF-8"); 
MessageDigest md = MessageDigest.getInstance("MD5"); 
byte[] Digest = md.digest(bytesOfchat_key); 

如果我扔的錯誤,給我ワ￟ㅄ9ㅔヌNP> 0xd中￉將z作爲響應(16個字符)

PS:我已經用來打印文摘

for (byte b : Digest) { 
    System.out.print((char)b); 
} 

回答

4

MD5返回十六進制數,因此對於它進行解碼,以一個序列Y OU可以使用

String plaintext = "lol"; 
MessageDigest m = MessageDigest.getInstance("MD5"); 
m.reset(); 
m.update(plaintext.getBytes()); 
byte[] digest = m.digest(); 
//Decoding 
BigInteger bigInt = new BigInteger(1,digest); 
String hashtext = bigInt.toString(16); 
while(hashtext.length() < 32){ 
    hashtext = "0"+hashtext; 
} 
1

程序不你的錯誤 - 你調用一個可以拋出那些異常的方法,所以你需要爲他們catch塊,或聲明的方法拋出他們太。

摘要的結果是二進制數據,而不是文本。你應該將它轉換逐字節的文本這樣的 - 如果你需要它作爲一個字符串,常見的有兩種解決方案:

  • 編碼每個字節作爲一個對十六進制數字
  • 使用完整字節陣列上的Base64編碼

這些中的每一個都可以用Apache Commons Codec輕鬆實現。

MessageDigest沒有問題,但我相信你對如何處理異常以及如何處理與文本數據不同的二進制數據有缺陷。

1

MessageDigest生成的字節不一定代表可打印的字符。您應該顯示每個字節的數值,或將字節數組轉換爲Base64字符串以便打印某些內容。

請參閱apache commons-codec以獲得Base64的實現。

你不得不處理兩個例外,因爲任何JVM都支持UTF-8,並且JVM本身也支持MD5算法。你應該這樣把你的代碼包裝在這樣的try catch塊中:

try { 
    byte[] bytesOfchat_key = "lol".getBytes("UTF-8"); 
    MessageDigest md = MessageDigest.getInstance("MD5"); 
    byte[] Digest = md.digest(bytesOfchat_key); 
} 
catch (NoSuchAlgorithmException e) { 
    throw new RuntimeException("something impossible just happened", e); 
} 
catch (UnsupportedEncodingException e) { 
    throw new RuntimeException("something impossible just happened", e); 
}