`
baobaoupup
  • 浏览: 470799 次
文章分类
社区版块
存档分类
最新评论

MessageDigest简介

 
阅读更多

本文博客原文

参考文章:http://blog.sina.com.cn/s/blog_4f36423201000c1e.html
一、概述
java.security.MessageDigest类用于为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。简单点说就是用于生成散列码信息摘要是安全的单向哈希函数,它接收任意大小的数据,输出固定长度的哈希值。关于信息摘要散列码请参照《数字证书简介

MessageDigest通过其getInstance系列静态函数来进行实例化和初始化。MessageDigest 对象通过使用update方法处理数据。任何时候都可以调用reset方法重置摘要。一旦所有需要更新的数据都已经被更新了,应该调用digest方法之一完成哈希计算并返回结果。

对于给定数量的更新数据,digest方法只能被调用一次。digest方法被调用后,MessageDigest对象被重新设置成其初始状态。

MessageDigest的实现可随意选择是否实现 Cloneable 接口。客户端应用程可以通过尝试复制和捕获 CloneNotSupportedException 测试可复制性:

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的实现是不可复制的,则仍然能够通过getInstance方法实例化几个实例计算来同时进行摘要信息的计算。

注意2:由于历史原因,此类是抽象的,是从MessageDigestSpi扩展的。应用程序开发人员只应该注意在此MessageDigest类中定义的方法;超类中的所有方法是供希望提供自己的信息摘要算法实现的加密服务提供者使用的。

注意3MessageDigest并不是单实例的。如下代码所示:

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

}

运行结果

mdTemp1==mdTemp2?:false

mdTemp2==mdTemp3?:false

构造方法摘要
protected MessageDigest(Stringalgorithm)
创建具有指定算法名称的MessageDigest实例对象
方法摘要
Object clone()
如果实现是可复制的,则返回一个副本。
byte[] digest()
通过执行诸如填充之类的最终操作完成哈希计算。
byte[] digest(byte[]input)
使用指定的字节数组对摘要进行最后更新,然后完成摘要计算。
int digest(byte[]buf, intoffset, intlen)
通过执行诸如填充之类的最终操作完成哈希计算。
String getAlgorithm()
返回标识算法的独立于实现细节的字符串。
int getDigestLength()
返回以字节为单位的摘要长度,如果提供程序不支持此操作并且实现是不可复制的,则返回 0。
staticMessageDigest getInstance(Stringalgorithm)
生成实现指定摘要算法的 MessageDigest 对象。
staticMessageDigest getInstance(Stringalgorithm,Providerprovider)
生成实现指定提供程序提供的指定算法的 MessageDigest 对象,如果该算法可从指定的提供程序得到的话。
staticMessageDigest getInstance(Stringalgorithm,Stringprovider)
生成实现指定提供程序提供的指定算法的 MessageDigest 对象,如果该算法可从指定的提供程序得到的话。
Provider getProvider()
返回此信息摘要对象的提供程序。
staticboolean isEqual(byte[]digesta, byte[]digestb)
比较两个摘要的相等性。
void reset()
重置摘要以供再次使用。
String toString()
返回此信息摘要对象的字符串表示形式。
void update(byteinput)
使用指定的字节更新摘要。
void update(byte[]input)
使用指定的字节数组更新摘要。
void update(byte[]input, intoffset, intlen)
使用指定的字节数组,从指定的偏移量开始更新摘要。
void update(ByteBufferinput)
使用指定的 ByteBuffer 更新摘要。
二、实际实践
2.1、创建MessageDigest对象
计算信息摘(即散列码)要做的第一步是创建MessageDigest对象实例。像所有的引擎类一样,获取某类报文摘要算法(即散列算法,比如MD5)的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 将返回已初始化过的MessageDigest对象。因此,它不需要进一步的初始化。
2.2、向MessageDigest传送要计算的数据
计算数据的摘要的第二步是向已初始化的MessageDigest对象提供传送要计算的数据。这将通过一次或多次调用以下某个update(更新)方法来完成:

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

2.3、计算摘要
通过调用 update 方法向MessageDigest对象传送要计算的数据后,你就可以调用以下某个 digest(摘要)方法来计算摘要(即生成散列码):

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

前两个方法返回计算出的摘要。后一个方法把计算出的摘要储存在所提供的 buf 缓冲区中,起点是 offset。len 是 buf 中分配给该摘要的字节数。该方法返回实际存储在 buf 中的字节数。
对第二个接受输入字节数组变量的 digest 方法的调用等价于用指定的输入调用:

public void update(byte[] input)

,接着调用不带参数的 digest 方法.
三、例子演示
3.1、★ 编程思路:
java.security包中的MessageDigest类提供了计算消息摘要即生成散列码的方法,首先生成对象,执行其update( )方法可
以将原始数据传递给该对象,然后执行其digest( )方法即可得到消息摘要。具体步骤如下:
(1)生成MessageDigest对象

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

MessageDigest类也是一个工厂类,其构造器是受保护的,不允许
直接使用new MessageDigist( )来创建对象,而必须通过其静态方法getInstance( )生成MessageDigest对象
其中传入的参数指定计算消息摘要所使用的算法,常用的有"MD5","SHA"等。
(2)传入需要计算的字符串

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

分析:x为需要计算的字符串,update传入的参数是字节类型或字节类型数组,对于字符串,需要先使用getBytes( )方法生成字符串数组。
(3)计算消息摘要

byte s[ ]=m.digest( );

分析:执行MessageDigest对象的digest( )方法完成计算,计算的结果通过字节类型的数组返回。
(4)处理计算结果
必要的话可以使用如下代码将计算结果(byte数组)转换为字符串。

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();
}
}

★运行结果

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;
}

调用函数

String str="0123456789"
System.out.printlnmd5sumWithEncoderstr));

输出
eB5eJF1ptWaXm4bijSPyxw==
3.4、示例三
关于此请参考《一点关于计算MD5的封装

分享到:
评论

相关推荐

    Java MessageDigest 的 getInstance 方法:简介、详解、实例代码和运行结果

    在本文中,我们介绍了 Java 中的 MessageDigest 类的 getInstance 方法。它是一个用于获取 MessageDigest 对象实例的工厂方法,通过指定加密算法名称,我们可以获得实现了该算法的 MessageDigest 实例。我们通过一个...

    MessageDigest 内容/文件 摘要生成

    对文件以及内容获取MD5 Sha-1 SHA1_Digest 摘要信息,并可选进行base64编码, SHA1_Digest 为apk MANIFEST.MF 中信息的摘要方式 /** * 得到文件摘要信息 * * @Description: * @param file ...

    MessageDigest摘要计算

    MessageDigest md = MessageDigest.getInstance("SHA1"); String MsgtoDigest="renhl252,dajiahao adjjasasoasoasoadoadao" +"renhl252,dajiahao adjjasasoasoasoadoadao" +"renhl252,dajiahao ...

    MessageDigest MD5加密

    MessageDiges java MD5 java加密

    Java MessageDigest:安全哈希函数及用法解析与示例

    本文中,我们简要介绍了Java MessageDigest类,并提供了一个使用SHA-256算法计算哈希值的完整实例和代码。MessageDigest类为我们提供了一种安全的方式来生成消息摘要,用于验证数据的完整性和比较数据的唯一性。虽然...

    Java中的MessageDigest类及digest()方法详解与示例

    本文简要介绍了Java中的MessageDigest类以及其digest()方法的使用。MessageDigest是Java中用于计算加密哈希值的工具,通过使用不同的哈希算法,可以生成不同长度的哈希值。digest()方法是其中的一个核心方法,它返回...

    javaMessageDigest md5算法详细实现

    public static String md5(String str) { try { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(str.getBytes()); byte b[] = md.digest();

    Java中MessageDigest来实现数据加密的方法

    主要介绍了Java中MessageDigest来实现数据加密的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    SHA-256 java加密代码

    关于信息摘要和散列码请参照《数字证书简介》 MessageDigest 通过其getInstance系列静态函数来进行实例化和初始化。MessageDigest 对象通过使用 update 方法处理数据。任何时候都可以调用 reset 方法重置摘要。一旦...

    Java自带的加密类MessageDigest类代码示例

    主要介绍了Java自带的加密类MessageDigest类代码示例,分享了常见的三种加密方式代码示例,具有一定参考价值,需要的朋友可以了解下。

    java自带的MessageDigest实现文本的md5加密算法

    主要介绍了java自带的MessageDigest实现文本的md5加密算法,需要的朋友可以参考下

    使用JAVA代码实现MD5加密

    MessageDigest md = MessageDigest.getInstance("MD5"); BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(md.digest(str.getBytes("utf-8"))); } catch (Exception e) { throw ...

    sha1-md5 加解密代码

    sha1-md5 加密源代码 ,可以直接加入用

    java加密枝术.doc

    java.security包中的MessageDigest类提供了计算消息摘要的方法, 首先生成对象,执行其update( )方法可以将原始数据传递给该对象,然后执行其digest( )方法即可得到消息摘要。

    javascript MD5算法实现

    javascript md5摘要算法的实现

    MD5_MessageDigest_java_md5_消息摘要_

    MD5消息摘要,对消息进行摘要,并进行摘要验证,最后输出消息摘要的结果

    Java 2平台安全技术-结构,API设计和实现

    7.3.3 java.security.MessageDigest 122 7.3.4 java.security.Signature 123 7.3.5 算法参数 124 7.3.6 java.security.Key和java.security. spec.KeySpec 126 7.3.7 java.security.KeyFactory和java. security....

    Message Digest 5算法 的C ++ 实现_代码_下载

    。 * 介绍 这是一个实现消息摘要算法 MD5 的 C++ 类。该算法的目的是计算给定位串的哈希值。MD5 产生一个 16 字节(128 位)的散列。 MD5 哈希已被证明在加密上容易受到各种攻击(谷歌它们),因此不应用于安全...

    MessageDigestTest

    总结MessageDigestTest中的一些用法。

    jdk-8u241-windows-i586 (1).exe

    MessageDigest 类提供信息摘要算法的功能,他是抽象类,需要MessageDigest.getInstance才能拿到MessageDigest的对象。以MD5为例下面是我碰到的问题以及解决方式 ##注意点1.拿到对象 他是抽象类,需要 ...

Global site tag (gtag.js) - Google Analytics