日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

MessageDigest简介

發(fā)布時間:2023/12/15 综合教程 30 生活家
生活随笔 收集整理的這篇文章主要介紹了 MessageDigest简介 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文博客原文

參考文章:
http://blog.sina.com.cn/s/blog_4f36423201000c1e.html

一、概述 java.security.
MessageDigest
類用于為應(yīng)用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。簡單點說就是用于生成
散列碼。
信息摘要是安全的單向哈希函數(shù),它接收任意大小的數(shù)據(jù),輸出固定長度的哈希值。關(guān)于
信息摘要

散列碼
請參照《
數(shù)字證書簡介

MessageDigest通過其getInstance系列靜態(tài)函數(shù)來進行實例化和初始化。MessageDigest 對象通過使用update方法處理數(shù)據(jù)。任何時候都可以調(diào)用reset方法重置摘要。一旦所有需要更新的數(shù)據(jù)都已經(jīng)被更新了,應(yīng)該調(diào)用digest方法之一完成哈希計算并返回結(jié)果。

對于給定數(shù)量的更新數(shù)據(jù),digest方法只能被調(diào)用一次。digest方法被調(diào)用后,MessageDigest對象被重新設(shè)置成其初始狀態(tài)。

MessageDigest的實現(xiàn)可隨意選擇是否實現(xiàn) Cloneable 接口。客戶端應(yīng)用程可以通過嘗試復(fù)制和捕獲 CloneNotSupportedException 測試可復(fù)制性:

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");

}

注意1:即時給定MessageDigest的實現(xiàn)是不可復(fù)制的,則仍然能夠通過getInstance方法實例化幾個實例計算來同時進行摘要信息的計算。

注意2:由于歷史原因,此類是抽象的,是從MessageDigestSpi擴展的。應(yīng)用程序開發(fā)人員只應(yīng)該注意在此MessageDigest類中定義的方法;超類中的所有方法是供希望提供自己的信息摘要算法實現(xiàn)的加密服務(wù)提供者使用的。

注意3:MessageDigest并不是單實例的。如下代碼所示:

try

{

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

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

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

System.out.println("mdTemp1==mdTemp2?:"+(mdTemp1==mdTemp2));

System.out.println("mdTemp2==mdTemp3?:"+(mdTemp2==mdTemp3));

} catch (NoSuchAlgorithmException e)

{

// TODO Auto-generated catch block

e.printStackTrace();

}

運行結(jié)果

mdTemp1==mdTemp2?:false

mdTemp2==mdTemp3?:false

構(gòu)造方法摘要
protected MessageDigest(Stringalgorithm)
創(chuàng)建具有指定算法名稱的MessageDigest實例對象。

方法摘要
Object clone()
如果實現(xiàn)是可復(fù)制的,則返回一個副本。
byte[] digest()
通過執(zhí)行諸如填充之類的最終操作完成哈希計算。
byte[] digest(byte[]input)
使用指定的字節(jié)數(shù)組對摘要進行最后更新,然后完成摘要計算。
int digest(byte[]buf, intoffset, intlen)
通過執(zhí)行諸如填充之類的最終操作完成哈希計算。
String getAlgorithm()
返回標識算法的獨立于實現(xiàn)細節(jié)的字符串。
int getDigestLength()
返回以字節(jié)為單位的摘要長度,如果提供程序不支持此操作并且實現(xiàn)是不可復(fù)制的,則返回 0。
staticMessageDigest getInstance(Stringalgorithm)
生成實現(xiàn)指定摘要算法的 MessageDigest 對象。
staticMessageDigest getInstance(Stringalgorithm,Providerprovider)
生成實現(xiàn)指定提供程序提供的指定算法的 MessageDigest 對象,如果該算法可從指定的提供程序得到的話。
staticMessageDigest getInstance(Stringalgorithm,Stringprovider)
生成實現(xiàn)指定提供程序提供的指定算法的 MessageDigest 對象,如果該算法可從指定的提供程序得到的話。
Provider getProvider()
返回此信息摘要對象的提供程序。
staticboolean isEqual(byte[]digesta, byte[]digestb)
比較兩個摘要的相等性。
void reset()
重置摘要以供再次使用。
String toString()
返回此信息摘要對象的字符串表示形式。
void update(byteinput)
使用指定的字節(jié)更新摘要。
void update(byte[]input)
使用指定的字節(jié)數(shù)組更新摘要。
void update(byte[]input, intoffset, intlen)
使用指定的字節(jié)數(shù)組,從指定的偏移量開始更新摘要。
void update(ByteBufferinput)
使用指定的 ByteBuffer 更新摘要。

二、實際實踐

2.1、創(chuàng)建
MessageDigest
對象 計算信息摘(即
散列碼
)要做的第一步是創(chuàng)建
MessageDigest
對象
實例。像所有的引擎類一樣,獲取某類報文摘要算法(即
散列算法
,比如
MD5
)的
MessageDigest
對象的途徑是調(diào)用
MessageDigest
類中的
getInstance
靜態(tài)
factory
方法:

public static MessageDigest getInstance(String algorithm)

注意:算法名不區(qū)分大小寫。例如,以下所有調(diào)用都是相等的:

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

調(diào)用程序可選擇指定提供者名稱,以保證所要求的算法是由已命名提供者實現(xiàn)的:

public static MessageDigest getInstance(String algorithm, String provider);

調(diào)用 getInstance 將返回已初始化過的
MessageDigest對象。因此,它不需要進一步的初始化。 2.2、向
MessageDigest
傳送要計算的數(shù)據(jù) 計算數(shù)據(jù)的摘要的第二步是向已初始化的
MessageDigest對象提供傳送要計算的數(shù)據(jù)。這將通過一次或多次調(diào)用以下某個
update(更新)方法來完成:

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

2.3、計算摘要 通過調(diào)用 update 方法向
MessageDigest對象
提傳送要計算的數(shù)據(jù)后,你就可以調(diào)用以下某個 digest(摘要)方法來計算摘要(即
生成
散列碼):

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

前兩個方法返回計算出的摘要。后一個方法把計算出的摘要儲存在所提供的 buf 緩沖區(qū)中,起點是 offset。len 是 buf 中分配給該摘要的字節(jié)數(shù)。該方法返回實際存儲在 buf 中的字節(jié)數(shù)。 對第二個接受輸入字節(jié)數(shù)組變量的 digest 方法的調(diào)用等價于用指定的輸入調(diào)用:

public void update(byte[] input)

,接著調(diào)用不帶參數(shù)的 digest 方法.

三、例子演示

3.1、★ 編程思路: java.security包中的
MessageDigest類提供了計算消息摘要

即生成
散列碼
)的方法,首先生成對象,執(zhí)行其
update( )方法可 以將原始數(shù)據(jù)傳遞給該對象,然后執(zhí)行其
digest( )方法即可得到消息摘要。具體步驟如下: (1)生成MessageDigest對象

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

MessageDigest類也是一個工廠類,其構(gòu)造器是受保護的,不允許 直接使用new MessageDigist( )來創(chuàng)建對象,而必須通過其靜態(tài)方法
getInstance( )生成
MessageDigest對象。 其中傳入的參數(shù)指定計算消息摘要所使用的算法,常用的有”
MD5“,”
SHA“等。 (2)傳入需要計算的字符串

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

分析:x為需要計算的字符串,update傳入的參數(shù)是字節(jié)類型或字節(jié)類型數(shù)組,對于字符串,需要先使用getBytes( )方法生成字符串數(shù)組。 (3)計算消息摘要

byte s[ ]=m.digest( );

分析:執(zhí)行MessageDigest對象的digest( )方法完成計算,計算的結(jié)果通過字節(jié)類型的數(shù)組返回。 (4)處理計算結(jié)果 必要的話可以使用如下代碼將計算結(jié)果(byte數(shù)組)轉(zhuǎn)換為字符串。

static String convertToHexString ( byte data []) { StringBuffer strBuffer = new StringBuffer (); for ( int i = 0 ; i < data . length ; i ++) { strBuffer . append ( Integer . toHexString ( 0xff & data [ i ])); } return strBuffer . toString (); }

3.2、示例一 ★完整程序如下:

public class MessageDigestDemo extends Thread { public void run () { String text = "abc" ; byte data [] = null ; MessageDigest m ; try { data = text . getBytes ( "UTF8" ); m = MessageDigest . getInstance ( "MD5" ); m . update ( data ); byte resultData [] = m . digest (); System . out . println ( convertToHexString ( resultData )); } catch ( NoSuchAlgorithmException e ) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } static String convertToHexString ( byte data []) { StringBuffer strBuffer = new StringBuffer (); for ( int i = 0 ; i < data . length ; i ++) { strBuffer . append ( Integer . toHexString ( 0xff & data [ i ])); } return strBuffer . toString (); } }

★運行結(jié)果

900150983cd24fb0d6963f7d28e17f72

3.3、示例二 在這里我們將對計算生成的md5使用
sun.misc.BASE64Encoder進行簡單的加密。

public String md5sumWithEncoder ( String text ) throws NoSuchAlgorithmException , UnsupportedEncodingException { /*確定計算方法*/ MessageDigest md5 = MessageDigest . getInstance ( "MD5" ); BASE64Encoder base64en = new BASE64Encoder (); /*加密后的散列碼字符串*/ String strMd5 = base64en . encode ( md5 . digest ( text . getBytes ( "utf-8" ))); return strMd5 ; }

調(diào)用函數(shù)

String str = "0123456789" System . out . println ( md5sumWithEncoder ( str ));

輸出 eB5eJF1ptWaXm4bijSPyxw==

3.4、示例三

關(guān)于此請參考《
一點關(guān)于計算MD5的封裝

總結(jié)

以上是生活随笔為你收集整理的MessageDigest简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。