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 有:Whirlpool、SHA-160, SHA-256, SHA-384, and SHA-512、MD5等,
更詳細的內容可見:
http://www.gnu.org/software/gnu-crypto/algorithms.html中的Message digest (hash)。
以下就是簡單的程式範例,其 hash 結果已經放在註解中:
參考資料:
無論是在網路傳送中有沒有被更改,或是檔案是不是同一個等等,
這時我們會需要 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 有:Whirlpool、SHA-160, SHA-256, SHA-384, and SHA-512、MD5等,
更詳細的內容可見:
http://www.gnu.org/software/gnu-crypto/algorithms.html中的Message digest (hash)。
以下就是簡單的程式範例,其 hash 結果已經放在註解中:
關鍵字:hash, digest, mac, hmac, md5, sha, whirlpool, 雜湊, 摘要, 演算法, 程式, 教學, 範例
- package demo.digest;
- import java.security.MessageDigest;
- import java.security.Security;
- /**
- * Java:計算 MD5, SHA, WHIRLPOOL等雜湊碼 hash code的程式教學
- *
- * @author werdna at http://werdna1222coldcodes.blogspot.com/
- */
- public class DigestDemo {
- // 本文應用的套件為:gnu-crypto-2.0.1
- // GNU Crypto - GNU Project - Free Software Foundation (FSF)
- // http://www.gnu.org/software/gnu-crypto/
- // 支授的演算法可見:http://www.gnu.org/software/gnu-crypto/algorithms.html
- public static void main(String[] args) {
- // 程式執行前須先將 Provider 加入
- Security.addProvider(new gnu.crypto.jce.GnuCrypto());
- // 初始化測試資料
- String stringToDigest = "這是要被hash(或稱雜湊、摘要)的字串";
- byte[] bytesToDigest = stringToDigest.getBytes();
- // Hash 範例:MD5
- // 要用 SHA, WHIRLPOOL 的話只要把 "MD5" 改為 "SHA"、"WHIRLPOOL"
- try {
- // 設定 Hash 演算法
- MessageDigest messageDigest = MessageDigest.getInstance("MD5");
- messageDigest.update(bytesToDigest);
- byte[] digest = messageDigest.digest();
- // 輸出 MD5 Hash:18:50:1F:84:0C:FE:2A:10:CE:89:B0:94:8E:FA:A0:42
- System.out.println(bytesToHex(digest));
- } catch (Exception e) {
- e.printStackTrace();
- }
- // Hash 範例:WHIRLPOOL
- // 更多 Hash 演算法可見:http://www.gnu.org/software/gnu-crypto/algorithms.
- html
- try {
- // 設定 Hash 演算法
- MessageDigest messageDigest = MessageDigest.getInstance("WHIRLPOOL");
- messageDigest.update(bytesToDigest);
- byte[] digest = messageDigest.digest();
- // 輸出 WHIRLPOOL Hash:
- // 2D:2E:C0:FE:70:71:23:51:7C:FD:E0:1C:9D:D0:CC:00:72:D7:42:38:1D:BD:
- // 10:7E:26:AC:DA:7B:D5:5A:03:7C:A9:17:B2:9C:29:EE:E7:88:7E:B4:DA:90:
- // DF:64:9B:F2:13:D6:FF:75:88:8C:05:E9:46:C5:94:B5:BB:BA:36:CE
- System.out.println(bytesToHex(digest));
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- // byte array 轉 hex 字串
- public static String bytesToHex(byte[] b) {
- StringBuffer sb = new StringBuffer();
- String stmp = "";
- for (int n = 0; n < b.length; n++) {
- stmp = (Integer.toHexString(b[n] & 0XFF));
- if (stmp.length() == 1) {
- sb.append("0").append(stmp);
- } else {
- sb.append(stmp);
- }
- if (n < b.length - 1) {
- sb.append(":");
- }
- }
- return sb.toString().toUpperCase();
- }
- }
參考資料:
留言
張貼留言