2008年7月6日 星期日

[Java] 如何使用數位簽章的功能? --- MessageDigest

要如何知道網路上取得的資料, 有沒有被更改過?

例如: 我們到一個網站上下載 一個軟體, 可是我如何確定這個軟體是原版的呢?  其實只要該網站在網上, 提供 MD5 數位簽章號碼, 我們即可進行驗證.

例如:

       原始網站 ---> MD5 碼 (如: d41d8cd98f00b204e9800998ecf8427e)

       B: 任意網站下載 軟體.

作法如下:

將需要驗證的軟體或文件準備好, 利用MD5 驗證工具產生MD5 碼, 然後與原始網站公布的 MD5 號碼字串比較.

若兩者 MD5 一樣, 則表示你下載的軟體與原始網站的軟體是一樣的. 當然, 最笨的方法就是到原始網站下載一份完整的軟體, 這樣也可以.

一般 MD5 數字只有幾組而已, 所以使用 MD5 的好處就是你不用下載完整的軟體, 就可以驗證整個軟體的正確性.

 

簡單的說, 就是
A 傳給 B: 文章 與 該文章在 A 方 用 md5 hash 後的碼(Ha)
B: 用他方 md5 演算法對收到的文章, 計算 hash 碼(Hb).
若收到的文章沒有經過更改, Ha 應該會 等於 Hb.

大概的認證流程.

 

為了保證文件或資料的正確性與一致性,  我們需要數位簽章.  有了數位簽章技術, 就可以把軟體或文件散佈到世界各地, 又能保證這些複製文件內容的正確性 (沒有被更改過).

Java 的作法:  我們使用 MessageDigest 類別幫我們處理, 下面是 MD5 簽章的範例.

        Main.java   DigestUtility.java 

        完整專案

 

Messagedigest 提供了許多數位簽章的演算法

 

近幾年來, 資訊安全界的大事就是大家常用的 MD5 這個數位簽章方法, 已經被發現可能會遭受到 collision 攻擊.

所以, MessageDigest 除了提供  MD5 演算法之外, 還提供擴充版本 SHA-256, SHA-384, SHA-512.

如何使用更安全的 SHA-256 演算法呢? 很簡單只要指明使用 SHA-256 即可.

 

下面是 SHA-512 的範例.

        Main.java   DigestUtility.java 

        完整專案

 

Enjoy.

 

by Jing

 

參考資料

[1] http://java.sun.com/j2se/1.4.2/docs/guide/security/CryptoSpec.html#AppA

[2] http://java.sun.com/j2se/1.4.2/docs/api/java/security/MessageDigest.html#getInstance(java.lang.String)

[3] 有關 MD5 碰撞攻擊的說明

[4] SHA 家族

1 則留言:

  1. 現在 MD5 可能不夠安全了,現在還有 MD5 快速碰撞產生器,實在讓人不怎麼安心......

    回覆刪除