2009年12月27日

Java:計算 MD5, SHA, WHIRLPOOL等雜湊碼 hash code的程式教學


 
在開發程式期間我們常需要確認檔案的正確性,
無論是在網路傳送中有沒有被更改,或是檔案是不是同一個等等,
這時我們會需要 hash(雜湊) 或 digest(摘要) 來幫忙。
同樣的內容或檔案經過相同的 hash 演算法後會得到相同的結果,
這樣就可以確認我們得到的是正確的檔案,
上面的用法就是我們常聽到的 HMAC(Hash-based Message Authentication Code)。

在 Java 中已內建有一些 hash 演算法如:MD5
想知道該怎麼用最基本的 hash 可見 Java 官方的教學:Java:HMAC-MD5 Example
然而我們總是會需要用到用更多種的演算法,
因此今天要介紹的就是一個支援多種 hash code 的套件:gnu-crypto
這個套件的官網連結為:GNU Crypto - GNU Project - Free Software Foundation (FSF)
其支援的 hash 有:WhirlpoolSHA-160, SHA-256, SHA-384, and SHA-512MD5等,
更詳細的內容可見:
http://www.gnu.org/software/gnu-crypto/algorithms.html中的Message digest (hash)。

以下就是簡單的程式範例,其 hash 結果已經放在註解中:
  1. package demo.digest;

  2. import java.security.MessageDigest;
  3. import java.security.Security;

  4. /**
  5. * Java:計算 MD5, SHA, WHIRLPOOL等雜湊碼 hash code的程式教學
  6. *
  7. * @author werdna at http://werdna1222coldcodes.blogspot.com/
  8. */

  9. public class DigestDemo {

  10. // 本文應用的套件為:gnu-crypto-2.0.1
  11. // GNU Crypto - GNU Project - Free Software Foundation (FSF)
  12. // http://www.gnu.org/software/gnu-crypto/
  13. // 支授的演算法可見:http://www.gnu.org/software/gnu-crypto/algorithms.html
  14. public static void main(String[] args) {

  15. // 程式執行前須先將 Provider 加入
  16. Security.addProvider(new gnu.crypto.jce.GnuCrypto());

  17. // 初始化測試資料
  18. String stringToDigest = "這是要被hash(或稱雜湊、摘要)的字串";
  19. byte[] bytesToDigest = stringToDigest.getBytes();

  20. // Hash 範例:MD5
  21. // 要用 SHA, WHIRLPOOL 的話只要把 "MD5" 改為 "SHA"、"WHIRLPOOL"
  22. try {
  23. // 設定 Hash 演算法
  24. MessageDigest messageDigest = MessageDigest.getInstance("MD5");
  25. messageDigest.update(bytesToDigest);
  26. byte[] digest = messageDigest.digest();

  27. // 輸出 MD5 Hash:18:50:1F:84:0C:FE:2A:10:CE:89:B0:94:8E:FA:A0:42
  28. System.out.println(bytesToHex(digest));
  29. } catch (Exception e) {
  30. e.printStackTrace();
  31. }

  32. // Hash 範例:WHIRLPOOL
  33. // 更多 Hash 演算法可見:http://www.gnu.org/software/gnu-crypto/algorithms.
  34. html
  35. try {
  36. // 設定 Hash 演算法
  37. MessageDigest messageDigest = MessageDigest.getInstance("WHIRLPOOL");
  38. messageDigest.update(bytesToDigest);
  39. byte[] digest = messageDigest.digest();

  40. // 輸出 WHIRLPOOL Hash:
  41. // 2D:2E:C0:FE:70:71:23:51:7C:FD:E0:1C:9D:D0:CC:00:72:D7:42:38:1D:BD:
  42. // 10:7E:26:AC:DA:7B:D5:5A:03:7C:A9:17:B2:9C:29:EE:E7:88:7E:B4:DA:90:
  43. // DF:64:9B:F2:13:D6:FF:75:88:8C:05:E9:46:C5:94:B5:BB:BA:36:CE
  44. System.out.println(bytesToHex(digest));
  45. } catch (Exception e) {
  46. e.printStackTrace();
  47. }
  48. }

  49. // byte array 轉 hex 字串
  50. public static String bytesToHex(byte[] b) {

  51. StringBuffer sb = new StringBuffer();
  52. String stmp = "";
  53. for (int n = 0; n < b.length; n++) {
  54. stmp = (Integer.toHexString(b[n] & 0XFF));
  55. if (stmp.length() == 1) {
  56. sb.append("0").append(stmp);
  57. } else {
  58. sb.append(stmp);
  59. }
  60. if (n < b.length - 1) {
  61. sb.append(":");
  62. }
  63. }
  64. return sb.toString().toUpperCase();
  65. }
  66. }
關鍵字:hash, digest, mac, hmac, md5, sha, whirlpool, 雜湊, 摘要, 演算法, 程式, 教學, 範例
參考資料:
  1. Java:HMAC-MD5 Example
  2. GNU Crypto - GNU Project - Free Software Foundation (FSF)
  3. gnu-crypto
  4. http://www.gnu.org/software/gnu-crypto/algorithms.html
  5. Whirlpool (cryptography) @ wikipedia


更多精選推薦文章

0 意見 :