MessageDigest數字簽名,加密

Java Cryptography Architecture,Java加密架構,java平臺中用於訪問和開發加密功能的框架。

MessageDigest 類

MessageDigest 類是一個引擎類,它是爲了提供諸如 SHA1 或 MD5 等密碼上安全的報文摘要功能而設計的。密碼上安全的報文摘要可接受任意大小的輸入(一個字節數組),併產生固定大小的輸出,該輸出稱爲一個摘要或散列。摘要具備如下屬性: html

  • 沒法經過計算找到兩個散列成相同值的報文。
  • 摘要不反映任何與輸入有關的內容。

使用報文摘要能夠生成數據惟一且可靠的標識符。有時它們被稱爲數據的「數字指紋」。 java

建立 MessageDigest 對象

計算摘要的第一步是建立報文摘要實例。象全部的引擎類同樣,獲取某類報文摘要算法的 MessageDigest 對象的途徑是調用 MessageDigest 類中的 getInstance 靜態 factory 方法: 算法

    public static MessageDigest getInstance(String algorithm)

注意:算法名不區分大小寫。例如,如下全部調用都是相等的: 編程

    MessageDigest.getInstance("SHA")    MessageDigest.getInstance("sha")     MessageDigest.getInstance("sHa")

調用程序可選擇指定提供者名稱,以保證所要求的算法是由已命名提供者實現的: 數組

    public static MessageDigest getInstance(String algorithm, String provider)

調用 getInstance 將返回已初始化過的報文摘要對象。所以,它不須要進一步的初始化。 安全

更新報文摘要對象

計算數據的摘要的第二步是向已初始化的報文摘要對象提供數據。這將經過一次或屢次調用如下某個 update(更新)方法來完成: 架構

    public void update(byte input)     public void update(byte[] input)     public void update(byte[] input, int offset, int len)

計算摘要

經過調用 update 方法提供數據後,程序就調用如下某個 digest(摘要)方法來計算摘要: 框架

    public byte[] digest()     public byte[] digest(byte[] input)     public int digest(byte[] buf, int offset, int len)

前兩個方法返回計算出的摘要。後一個方法把計算出的摘要儲存在所提供的 buf 緩衝區中,起點是 offsetlen 是 buf 中分配給該摘要的字節數。該方法返回實際存儲在 buf 中的字節數。 ide

對接受輸入字節數組變量的 digest 方法的調用等價於用指定的輸入調用: 函數

    public void update(byte[] input)

,接着調用不帶參數的 digest 方法.

示例一:

★ 編程思路:

java.security包中的MessageDigest類提供了計算消息摘要的方法,首先生成對象,執行其update( )方法可

以將原始數據傳遞給該對象,而後執行其digest( )方法便可獲得消息摘要。具體步驟以下:


(1)生成MessageDigest對象

MessageDigest m=MessageDigest.getInstance("MD5");

分析:和2.2.1小節的KeyGenerator類同樣。MessageDigest類也是一個工廠類,其構造器是受保護的,不容許

直接使用new MessageDigist( )來建立對象,而必須經過其靜態方法getInstance( )生成MessageDigest對象。

其中傳入的參數指定計算消息摘要所使用的算法,經常使用的有"MD5","SHA"等。若對MD5算法的細節感興趣可參考

http://www.ietf.org/rfc/rfc1321.txt。

(2)傳入須要計算的字符串

m.update(x.getBytes("UTF8" ));

分析:x爲須要計算的字符串,update傳入的參數是字節類型或字節類型數組,對於字符串,須要先使用

getBytes( )方法生成字符串數組。

(3)計算消息摘要

byte s[ ]=m.digest( );

分析:執行MessageDigest對象的digest( )方法完成計算,計算的結果經過字節類型的數組返回。

(4)處理計算結果

必要的話可使用以下代碼將計算結果s轉換爲字符串。

String result="";

for (int i=0; i

result+=Integer.toHexString((0x000000ff & s[i]) | 0xffffff00).substring(6);

}
★代碼與分析:
完整程序以下:
import java.security.*;
public class DigestPass{
public static void main(String args[ ]) throws Exception{

String x=args[0];

MessageDigest m=MessageDigest.getInstance("MD5");

m.update(x.getBytes("UTF8"));

byte s[ ]=m.digest( );

String result="";

for (int i=0; i

result+=Integer.toHexString((0x000000ff & s[i]) | 0xffffff00).substring(6);

}

System.out.println(result);

}

}

★運行程序

輸入java DigestCalc abc來運行程序,其中命令行參數abc是原始數據,屏幕輸出計算後的消息摘要:

900150983cd24fb0d6963f7d28e17f72。 

 

示例二:


    
public String EncoderByMd5(String str) throws NoSuchAlgorithmException, 

UnsupportedEncodingException {
        
//肯定計算方法
        MessageDigest md5=MessageDigest.getInstance("MD5");
        BASE64Encoder base64en 
= new BASE64Encoder();
        
//加密後的字符串
        String newstr=base64en.encode(md5.digest(str.getBytes("utf-8")));
        
return newstr;
    }
調用函數:String str="0123456789"

 System.out.println(EncoderByMd5(str));

 輸出:eB5eJF1ptWaXm4bijSPyxw==

相關文章
相關標籤/搜索