<1>MessageDigest基础

  MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。

  MessageDigest 对象开始被初始化。该对象通过使用 update()方法处理数据。任何时候都可以调用 reset()方法重置摘要。一旦所有需要更新的数据都已经被更新了,应该调用digest() 方法之一完成哈希计算。

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

  

1、public static MessageDigest getInstance(String algorithm) throws NoSuchAlgorithmException
   返回实现指定摘要算法的 MessageDigest 对象。
     algorithm - 所请求算法的名称
2、public static MessageDigest getInstance(String algorithm,String provider)throws NoSuchAlgorithmException,NoSuchProviderException
  返回实现指定摘要算法的 MessageDigest 对象。
    algorithm - 所请求算法的名称
    provider - 提供者的名称。
3、public void update(byte[] input)
  使用指定的 byte 数组更新摘要。 
4、public byte[] digest()
  通过执行诸如填充之类的最终操作完成哈希计算。在调用此方法之后,摘要被重置。
5、public static boolean isEqual(byte[] digesta, byte[] digestb)
比较两个摘要的相等性。做简单的字节比较。

注意:Provider可以通过 Java.security.Security.getProviders() 方法获取已注册提供者列表。比较常用的有“SUN”

SUN提供的常用的算法名称有:

          MD2
          MD5
                        SHA-1
                        SHA-256
                        SHA-384
                        SHA-512

举例说明:

  /**
* 将一个字符串进行MD5算法,获取摘要
* @param str
* @return
*/
public static String md5Hex(String str){
byte[] data = str.getBytes();
try {
//获取指定算法的MessageDigest对象
MessageDigest digest = MessageDigest.getInstance("MD5");
//更新摘要
digest.update(data);
//获取经过摘要算法后的摘要字节数组
byte[] messageDigest = digest.digest();
StringBuffer hexString = new StringBuffer();
//将经摘要算法的字节数组装换成十六进制的字符串
for(byte b : messageDigest){
String hex = Integer.toHexString(b & 0xff);
if(hex.length()<2){ //长度小于2,转换时需加上一个0,构成两位格式
hexString.append(0);
}
hexString.append(hex);
}
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}

<二> MessageDigest高级应用

(1)MessageDigest对文件进行摘要计算

  /**
* 获取文件信息摘要计算
* @param in
* @return
* @throws IOException
* @throws NoSuchAlgorithmException
*/
public static String fileResume(InputStream in) throws IOException, NoSuchAlgorithmException{
MessageDigest digest = MessageDigest.getInstance("MD5"); byte[] buf = new byte[1024];
int len = 0;
while((len = in.read(buf))!=-1){
//每次更新缓冲中的字节摘要
digest.update(buf,0,len);
}
byte[] data = digest.digest();
//获取经过摘要算法后的摘要字节数组
byte[] messageDigest = digest.digest();
StringBuffer hexString = new StringBuffer();
//将经摘要算法的字节数组装换成十六进制的字符串
for(byte b : messageDigest){
String hex = Integer.toHexString(b & 0xff);
if(hex.length()<2){ //长度小于2,转换时需加上一个0,构成两位格式
hexString.append(0);
}
hexString.append(hex);
}
return hexString.toString();
}

(2)第三方jar包

  commons-codec 提供了便捷的MD5工具类, 可以简化消息摘要计算:

  引入jar包后,直接调用

    DigestUtil.DigestUtils.md5Hex(String str)  获取字符串的MD5信息摘要

    DigestUtils.sha1Hex(String str)  获取字符串的SHA-1信息摘要

    DigestUtils.md5Hex(InputStream in) 获取输入流的MD5信息摘要

<三>MD5原理

MessageDigest消息摘要的更多相关文章

  1. 使用JDK自带的MessageDigest计算消息摘要

    使用JDK自带的MessageDigest计算消息摘要 上代码 /** * 使用JDK自带MessageDigest */ public class MessageDigestUtils { /** ...

  2. 消息摘要java.security.MessageDigest

    这是一种与消息认证码结合使用以确保消息完整性的技术.主要使用单向散列函数算法,可用于检验消息的完整性,和通过散列密码直接以文本形式保存等,目前广泛使用的算法有MD4.MD5.SHA-1,jdk1.5对 ...

  3. Java 消息摘要 散列 MD5 SHA

    package xxx.common.util; import java.math.BigInteger; import java.security.MessageDigest; import jav ...

  4. [Java 安全]消息摘要与数字签名

    消息摘要 算法简述 定义 它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生.如果消息在途中改变了,则接收者通过对收到消息的新产生的摘要与原摘要比较,就可知 ...

  5. HMAC加密的消息摘要码

    HMAC(Hash Message Authentication Code)哈希消息授权码,它在消息摘要算法(例如MD5,SHA系列算法)的基础上,使用密钥对消息摘要进行加密.它相当于一个马甲,内里可 ...

  6. java中的数据加密1 消息摘要

    消息摘要(Message Digest) 又称为数字摘要(Digital Digest).它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生.如果消息在途中 ...

  7. 基于HTTP在互联网传输敏感数据的消息摘要、签名与加密方案

    基于HTTP在互联网传输敏感数据的消息摘要.签名与加密方案 博客分类: 信息安全 Java 签名加密AESMD5HTTPS  一.关键词 HTTP,HTTPS,AES,SHA-1,MD5,消息摘要,数 ...

  8. SHA_1计算消息摘要

    /** * SHA_1计算消息摘要 * @param bytes 待计算数据 * @return */ public static String SHA_1(byte[] bytes) { Strin ...

  9. 消息摘要技术(MD5)

    1.使用消息摘要技术对密码加密 数据库存储的是经过消息摘要技术加密之后的信息, 避免保存密码明文,提升了系统安全性 必要性说明: 如果存储明文密码,数据库系统管理员和攻破系统的黑客是可以拿到你的所有信 ...

随机推荐

  1. MVVM模式下弹出窗体

    原地址:http://www.cnblogs.com/yk250/p/5773425.html 在mvvm模式下弹出窗体,有使用接口模式传入参数new一个对象的,还有的是继承于一个window,然后在 ...

  2. Chrome插件概览(一) – The basics

    转载http://lvjava.com/?p=582 原文见https://developer.chrome.com/extensions/overview.html Chrome Extension ...

  3. django orm 操作

    django的orm使用方便,但对于一些复杂的操作,需要遵循特定的规范,特例特别记录一下: 模型: from django.db import models class Blog(models.Mod ...

  4. 使用struts通配符报错

    报错截图如下: 主要原因是:对大小写敏感. struts.xml StudentAction.java jsp页面:(重点就是这里,锚里面需要特别注意,大小写应该与struts.xml里面的保持一致, ...

  5. Spark Streaming源码解读之No Receivers彻底思考

    本期内容 : Direct Acess Kafka Spark Streaming接收数据现在支持的两种方式: 01. Receiver的方式来接收数据,及输入数据的控制 02. No Receive ...

  6. VS2013安装

    下载 等待下载完成之后,虽然下载文件是ios格式,但可以用解压缩工具解压打开.解压好后,双击vs_ultimate.exe,开始安装. 自定义选择安装路径,同意许可条款,进行下一步. 在选择安装的可选 ...

  7. Mac下命令行中用sublime打开指定文件 设置方法

    sublime2版本 官网提供的方法:sublime2 官网提供的方法是:ln -s "/Applications/Sublime Text 2.app/Contents/SharedSup ...

  8. java闭包

    闭包就是在一个外部类A中声明了一个内部类B,然后这个内部类可以访问他自己B的作用域和外部类A的作用域.然后现在用另外一个类C创建了一个内部类B,那么这个内部类B可以访问C的作用域. 如果没有闭包,那B ...

  9. sudo,linux 新建账号,并开通ssh登录

    新建账号需要root账号或sudo权限,sudo配置保存在/etc/sudoers文件. sudoers的配置格式一般为: root ALL=(ALL:ALL) ALL %sudo ALL=(ALL: ...

  10. Mac PHP 环境配置+渗透环境

    /* 最近购入一台mac pro 配置自己的php环境以及渗透环境 留个笔记 */ Mac 自带的PHP 加 apache 所以就不需要install 咯.只需要down个mysql 就好了. 0x1 ...