本文博客原文

參考文章: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 接口。client应用程能够通过尝试复制和捕获 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 类中定义的方法;超类中的全部方法是供希望提供自己的信息摘要算法实现的加密服务提供者使用的。

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

}

执行结果


mdTemp1==mdTemp2?:false

mdTemp2==mdTemp3?:false
构造方法摘要
protected MessageDigest(String algorithm) 

          创建具有指定算法名称的MessageDigest 实例对象。
方法摘要
 Object clone() 

          假设实现是可复制的,则返回一个副本。
 byte[] digest() 

          通过运行诸如填充之类的终于操作完毕哈希计算。
 byte[] digest(byte[] input) 

          使用指定的字节数组对摘要进行最后更新,然后完毕摘要计算。
 int digest(byte[] buf, int offset, int len) 

          通过运行诸如填充之类的终于操作完毕哈希计算。
 String getAlgorithm() 

          返回标识算法的独立于实现细节的字符串。
 int getDigestLength() 

          返回以字节为单位的摘要长度,假设提供程序不支持此操作而且实现是不可复制的,则返回 0。
static MessageDigest getInstance(String algorithm) 

          生成实现指定摘要算法的 MessageDigest 对象。
static MessageDigest getInstance(String algorithm, Provider provider) 

          生成实现指定提供程序提供的指定算法的 MessageDigest 对象,假设该算法可从指定的提供程序得到的话。
static MessageDigest getInstance(String algorithm, String provider) 

          生成实现指定提供程序提供的指定算法的 MessageDigest 对象,假设该算法可从指定的提供程序得到的话。
 Provider getProvider() 

          返回此信息摘要对象的提供程序。
static boolean isEqual(byte[] digesta, byte[] digestb) 

          比較两个摘要的相等性。
 void reset() 

          重置摘要以供再次使用。
 String toString() 

          返回此信息摘要对象的字符串表示形式。
 void update(byte input) 

          使用指定的字节更新摘要。
 void update(byte[] input) 

          使用指定的字节数组更新摘要。
 void update(byte[] input, int offset, int len) 

          使用指定的字节数组,从指定的偏移量開始更新摘要。
 void update(ByteBuffer input) 

          使用指定的 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.println(md5sumWithEncoder(str));
 输出
eB5eJF1ptWaXm4bijSPyxw==

3.4、演示样例三

关于此请參考《一点关于计算MD5的封装

MessageDigest简单介绍的更多相关文章

  1. [原创]关于mybatis中一级缓存和二级缓存的简单介绍

    关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...

  2. 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍

    一.pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主要目的是为了数据分析.它提供了大量高级的数据结构和对数据处理的方法. pandas 有两个主要的数据结构 ...

  3. 利用Python进行数据分析(4) NumPy基础: ndarray简单介绍

    一.NumPy 是什么 NumPy 是 Python 科学计算的基础包,它专为进行严格的数字处理而产生.在之前的随笔里已有更加详细的介绍,这里不再赘述. 利用 Python 进行数据分析(一)简单介绍 ...

  4. yii2的权限管理系统RBAC简单介绍

    这里有几个概念 权限: 指用户是否可以执行哪些操作,如:编辑.发布.查看回帖 角色 比如:VIP用户组, 高级会员组,中级会员组,初级会员组 VIP用户组:发帖.回帖.删帖.浏览权限 高级会员组:发帖 ...

  5. angular1.x的简单介绍(二)

    首先还是要强调一下DI,DI(Denpendency Injection)伸手获得,主要解决模块间的耦合关系.那么模块是又什么组成的呢?在我看来,模块的最小单位是类,多个类的组合就是模块.关于在根模块 ...

  6. Linux的简单介绍和常用命令的介绍

    Linux的简单介绍和常用命令的介绍 本说明以Ubuntu系统为例 Ubuntu系统的安装自行百度,或者参考http://www.cnblogs.com/CoderJYF/p/6091068.html ...

  7. iOS-iOS开发简单介绍

    概览 终于到了真正接触IOS应用程序的时刻了,之前我们花了很多时间去讨论C语言.ObjC等知识,对于很多朋友而言开发IOS第一天就想直接看到成果,看到可以运行的IOS程序.但是这里我想强调一下,前面的 ...

  8. iOS开发多线程篇—多线程简单介绍

    iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...

  9. iOS开发UI篇—UITabBarController简单介绍

    iOS开发UI篇—UITabBarController简单介绍 一.简单介绍 UITabBarController和UINavigationController类似,UITabBarControlle ...

随机推荐

  1. 建立一个ROS msg and srv

    msg是一个描述ROS消息字段的简单的文本文件,它们经常用来为消息产生不同语言的源代码. srv文件描述一个服务,它由请求和响应两部分组成. msg文件被存储在一个包的msg目录下,srv文件被存储在 ...

  2. Redis Sentinel的Redis集群(主从&Sharding)高可用方案

    在不使用redis3.0之后版本的情况下,对于redis服务端一般是采用Sentinel哨兵模式,也就是一主多备的方式. 这里,先抛出三个问题, 问题1:单节点宕机数据丢失?问题2:多节点(节点间没有 ...

  3. 专访CEO何朝曦:深信服高速成长的秘诀

    在深信服公司深圳总部的办公室里,要迅速找到几位高管的工位远远不如找一位女员工的座位那样容易. 深信服CEO何朝曦先生 公司里虽然女孩很少,但几乎每位女员工的工位上都有一盆绿植.相比之下,从公司CEO何 ...

  4. HDU 4366 Successor(树链剖分+zkw线段树+扫描线)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4366 [题目大意] 有一个公司,每个员工都有一个上司,所有的人呈树状关系,现在给出每个人的忠诚值和 ...

  5. mysql的索引问题

    注意:索引一般适合用于经常查询的数据,可以提高查询效率:但是不适合用于经常用到增.删.改的数据:会影响效率低. 1.unique key->(唯一索引)在一张表里可以有多个,起到约束的作用:避免 ...

  6. POJ1363:Rails

    Description There is a famous railway station in PopPush City. Country there is incredibly hilly. Th ...

  7. [Swust OJ 589]--吃西瓜(三维矩阵压缩)

    题目链接:http://acm.swust.edu.cn/problem/589/ Time limit(ms): 2000 Memory limit(kb): 65535   Description ...

  8. Html中截切文章内容,造成标签不全的问题

    把标签全部进行替换 ) { string strText = System.Text.RegularExpressions.Regex.Replace(html, "<[^>]+ ...

  9. html5储存篇(二)

    indexedDB   相对于html5 中提到 web SQL Database,w3c已经明确声明放弃对其的继续支持,开始支持新的客户端数据库 indexedDB ,indexedDB 是一种no ...

  10. A Byte of Python 笔记(7)数据结构:列表、元组、字典,序列

    第9章 数据结构 数据结构,即可以处理一些数据的结构.或者说,它们是用来存储一组相关数据的. python 有三种内建的数据结构--列表.元组和字典. list = ['item1', 'item2' ...