转自http://blog.csdn.net/hudashi/article/details/8394158

一、概述

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 类中定义的方法;超类中的所有方法是供希望提供自己的信息摘要算法实现的加密服务提供者使用的。

注意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

构造方法摘要

protectedMessageDigest(String algorithm)

创建具有指定算法名称的MessageDigest 实例对象。

方法摘要

Objectclone()

如果实现是可复制的,则返回一个副本。

byte[]digest()

通过执行诸如填充之类的最终操作完成哈希计算。

byte[]digest(byte[] input)

使用指定的字节数组对摘要进行最后更新,然后完成摘要计算。

intdigest(byte[] buf, int offset, int len)

通过执行诸如填充之类的最终操作完成哈希计算。

StringgetAlgorithm()

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

intgetDigestLength()

返回以字节为单位的摘要长度,如果提供程序不支持此操作并且实现是不可复制的,则返回 0。

static MessageDigestgetInstance(String algorithm)

生成实现指定摘要算法的 MessageDigest 对象。

static MessageDigestgetInstance(String algorithm, Provider provider)

生成实现指定提供程序提供的指定算法的 MessageDigest 对象,如果该算法可从指定的提供程序得到的话。

static MessageDigestgetInstance(String algorithm, String provider)

生成实现指定提供程序提供的指定算法的 MessageDigest 对象,如果该算法可从指定的提供程序得到的话。

ProvidergetProvider()

返回此信息摘要对象的提供程序。

static booleanisEqual(byte[] digesta, byte[] digestb)

比较两个摘要的相等性。

voidreset()

重置摘要以供再次使用。

StringtoString()

返回此信息摘要对象的字符串表示形式。

voidupdate(byte input)

使用指定的字节更新摘要。

voidupdate(byte[] input)

使用指定的字节数组更新摘要。

voidupdate(byte[] input, int offset, int len)

使用指定的字节数组,从指定的偏移量开始更新摘要。

voidupdate(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的封装》

java messagedigest_JAVA MessageDigest(MD5加密等)相关推荐

  1. java对密码进行加密的方法_如何在JAVA中使用MD5加密对密码进行加密

    如何在JAVA中使用MD5加密对密码进行加密 发布时间:2020-11-25 17:12:40 来源:亿速云 阅读:118 作者:Leah 本篇文章为大家展示了如何在JAVA中使用MD5加密对密码进行 ...

  2. java中的md5加密_java中的MD5加密

    java中的MD5加密 2016-01-22 09:07:00 admin 原创 1144 摘要:java中的MD5加密 /** * * md5加密 * @author LiuJiawan * @da ...

  3. java中md5加密和解密_如何在java中实现md5加密和解密

    如何在java中实现md5加密和解密 关注:273  答案:1  mip版 解决时间 2021-01-19 20:37 提问者精神疯裂 2021-01-19 05:36 如何在java中实现md5加密 ...

  4. java 短连接+MD5加密短链接

    java 短连接+MD5加密短链接 import java.security.MessageDigest; public class ShotUrlUtil { public static void ...

  5. java 和 c md5加密_Java与C++实现同样的MD5加密算法

    1.Java版 package com.lyz.utils.common; import java.io.UnsupportedEncodingException; import java.secur ...

  6. php和java md5 不同,JAVA 和 PHP md5 加密后的值不一致

    想要将一段 JAVA 实现的一致性哈希用 PHP 代码实现出来,但是不太懂 JAVA, 搜索了下资料大概知道是因为 JAVA 和 PHP md5 加密后的值对不上,所以问题变成了如何用 PHP 代码实 ...

  7. java实现php md5加密解密,java_Java后端实现MD5加密的方法,前言 在我们开发是要考虑这 - phpStudy...

    Java后端实现MD5加密的方法 前言 在我们开发是要考虑这个功能,当用户忘记密码的情况下,我们需要动态的发给他一个6位的随机密码,通过即时通,短信,微信等.并同时修改数据库中的原密码为这6位的随机密 ...

  8. Java工具集-MD5加密工具

    简单工具类 写作初衷:由于日常开发经常需要用到很多工具类,经常根据需求自己写也比较麻烦 网上好了一些工具类例如commom.lang3或者hutool或者Jodd这样的开源工具,但是 发现他们之中虽然 ...

  9. Java代码实现MD5加密的两种方式

    MD5的全称是Message-Digest Algorithm 5 (信息-摘要算法),在90年代初,由MIT Laboratory for Computer Scientce 和RSA Data S ...

  10. java中完成md5加密解密_java实现md5加密解密 notNET中加密和解密的实现方法

    java实现md5加密解密 notNET中加密和解密的实现方法 亦或是旅途风光 7-14 1918℃ 22 [ ee21.cn - ASP.NET ] .NET将原来独立的API和SDK合并到一个框架 ...

最新文章

  1. 8086 CPU 寄存器简介
  2. 使用Nginx+FFMPEG搭建HLS直播转码服务器
  3. Spring 整合hibernate
  4. JVM学习笔记(四)
  5. 算法小白——基本排序算法入门
  6. android studio中把c/c++文件编译成.so库(一)
  7. php批量删除例子,php批量删除数据完整实例代码
  8. [Hive]Hive常用的优化方法
  9. Maven 本地仓库明明有jar包,pom文件还是报错解决办法(Missing artifact...jar)
  10. 01背包问题理解笔记
  11. RealVIZ Stitcher Unlimited v5.5.1 1CD
  12. android远程控制电视,手机怎么远程控制电视
  13. 2040: [蓝桥杯2022初赛] 砍竹子(优先队列)
  14. win中q-dir,everything,Windows Tabs,Clover各种效率神器(搜索,资源管理器,多标签)
  15. Go strings.ToLower函数
  16. 计算逻辑单元(ALU)和存储单元
  17. lxr-0.3.1 源码阅读 How To.
  18. Python实现jpg/png/jpeg图片转base64编码文件
  19. spring boot: Whitelabel Error Page(小白的终极解决方案)
  20. 烽火MobileArk产品——企业移动设备管理软件

热门文章

  1. 计算机科学与技术与数学建模,数学建模
  2. 分簇路由算法 LEACH算法
  3. 单片机:Keil的安装教程
  4. 打开Excle出现配置进度解决方法
  5. 第1章:BPSK调制解调器
  6. PIC16F887 单片机 proteus 红外遥控灯光控制系统
  7. 对接阿里云天气,获取天气预报数据
  8. 一文详解中英文在NLP上的10大差异点
  9. 最新WIN10系统封装教程2019系列(一)——定制母盘
  10. matlab 矩阵规定化,Matlab实现直方图规定化