總網頁瀏覽量

2016年5月16日 星期一

[Java] Hash number

在網路上看到一段程式碼,類似於產生 Hash number。

Package java.security [1]
提供類別語介面的安全性架構。使這些類別實作可以更簡單的配置,更完整的控制安全套件。Package 產生密碼學上的公私鑰對,也可輸出密碼學上操作的數位訊息(message digest)和簽章(signature)。最後此類別提供  登入signed/防護guarded 物件和安全亂數產生器。


import java.io.*;
import java.security.*;

public class HancockTest {
    public static void main(String[] args) throws Exception {
       try{
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            FileInputStream fis=new FileInputStream("HellowWorld.jar");
            byte b;
            while(fis.available()!=0){
                b=(byte)fis.read();
                md5.update(b);
                System.out.println(b);
            }
            fis.close();
            byte[] digest=md5.digest();
            StringBuffer hexString = new StringBuffer();
            for (int i=0;i<digest.length;i++) {
                if(Integer.toHexString(0xFF & digest[i]).length() == 1){
                   hexString.append("0");
                }
                hexString.append(Integer.toHexString(0xFF & digest[i]));
                hexString.append(" ");
            }
            System.out.println(hexString.toString());
        }
        catch(NoSuchAlgorithmException ie){
            ie.printStackTrace();
        }
    }









MessageDigest:

Class MessageDigest 
 - java.lang.Object
  - java.security.MessageDigestSpi
   - java.security.MessageDigest 

提供 message digest algorithm 的功能應用,像是 SHA-1 或 SHA-256。
Message digest 安全性上是個 one-way function,對於任意大小(size)的資料,
輸出固定長度(length)的值。

MessageDigest 物件先初使化。檔案的程序使用 update 方法,也可以使用 reset物件做重製。當檔案做好 update,就使用 digest 方法來完成 Hash 的運算。

digest 方法能夠呼叫經過 update 的值,之後才還成 digest 的呼叫,而 MessageDigest 則會更新初使化的狀態。

實作後請記得關閉(cloneable)介面,否則會跳出例外。

MessageDigest md = MessageDigest.getInstance("SHA"); 

 try {
     md.update(toChapter1);
     MessageDigest tc1 = md.clone();
     byte[] toChapter1Digest = tc1.digest();
     md.update(toChapter2);
     ...etc.
 } catch (CloneNotSupportedException cnse) {
     throw new DigestException("couldn't make digest of partial content");
 }

MessageDigest 提供三種演算法 [2],
MD 5
SHA-1
SHA-256



MessageDigest 下的 getInstance()

static MessageDigest getInstance(String algorithm)
static MessageDigest getInstance(String algorithm, Provider provider)
static MessageDigest getInstance(String algorithm, String provider)

MessageDigest 下的 update() 
void update(byte input)
- Updates the digest using the specified byte.
void update(byte[] input)
- Updates the digest using the specified array of bytes.
void update(byte[] input, int offset, int len)
- Updates the digest using the specified array of bytes, starting at the specified offset.
void update(byteBuffer input)
- Update the digest using the specified ByteBuffer.

MessageDigest 下的 digest()
Updates the digest using the specified byte.

byte[] digest(byte[] input)
Performs a final update on the digest using the specified array of bytes, then completes the digest computation.

以上打的落落長還是點點懂,以後有機會在整理一下或重新po文章。

[1] https://docs.oracle.com/javase/7/docs/api/java/security/package-summary.html#package_description
[2] https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#MessageDigest

[3]https://dotblogs.com.tw/chhuang/2011/01/19/20883



沒有留言:

張貼留言