运用Java获取消息摘要

消息摘要简单介绍

消息摘要算法的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。消息摘要算法不存在密钥的管理与分发问题,适合于分布式网络相同上使用。由于其加密计算的工作量相当可观,所以以前的这种算法通常只用于数据量有限的情况下的加密,例如计算机的口令就是用不可逆加密算法加密的。近年来,随着计算机相同性能的飞速改善,加密速度不再成为限制这种加密技术发展的桎梏,因而消息摘要算法应用的领域不断增加。现在,消息摘要算法主要应用在“数字签名”领域,作为对明文的摘要算法。著名的摘要算法有RSA公司的MD5算法和SHA-1算法及其大量的变体。消息摘要返回的这些比特看上去是胡乱的杂凑在一起的。可以用大量的输入来检验其输出是否相同,一般,不同的输入会有不同的输出,而且输出的摘要消息可以通过随机性检验。但是,一个摘要并不是真正随机的,因为用相同的算法对相同的消息求两次摘要,其结果必然相同;而若是真正随机的,则无论如何都是无法重现的。因此消息摘要是“伪随机的”。

预知专业的算法介绍,需参考专业书籍。

找出系统支持的消息摘要算法

package date0803;
/**
 * 找出系统支持的消息摘要算法
 */
import java.security.Security;

public class PrintMessageDigestAlgorithmsAvailable {

	public static void main(String[] args) {
		System.out.println("---------系统支持的消息摘要算法有--------");
	    for (String s : Security.getAlgorithms("MessageDigest")) {
	      System.out.println(s);
	    }
	}

}

支持的算法有:

---------系统支持的消息摘要算法有--------
SHA-384
SHA-224
SHA-256
MD2
SHA
SHA-512
MD5

获取消息摘要的线程创建

package date0803;
/**
 * 编写一个程序来计算文件的消息摘要
 * 使用线程,便于批量计算文件的消息摘要
 * @author zzw922cn
 */
import java.io.FileInputStream;
import java.io.IOException;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import javax.xml.bind.DatatypeConverter;

public class FileDigestThread extends Thread {

	private String filename;

	/**
	 *
	 * @param filename 文件名
	 */
	public FileDigestThread(String filename) {
		super();
		this.filename = filename;
	}

	/**
	 * 线程的主要方法
	 */
	@Override
	public void run() {
		try {
			//文件输入流
			FileInputStream fileInputStream = new FileInputStream(filename);

			//指定算法,创建消息摘要的单例
			MessageDigest instance = MessageDigest.getInstance("SHA");
//			MessageDigest instance = MessageDigest.getInstance("SHA-512");
//			MessageDigest instance = MessageDigest.getInstance("SHA-384");
//			MessageDigest instance = MessageDigest.getInstance("SHA-256");
//			MessageDigest instance = MessageDigest.getInstance("SHA-224");
//			MessageDigest instance = MessageDigest.getInstance("MD5");
//			MessageDigest instance = MessageDigest.getInstance("MD2");

			//创建摘要输入流,即从特定输入流和消息摘要来创建
			DigestInputStream digestInputStream = new DigestInputStream(fileInputStream, instance);

			//读取字节,并且更新摘要,然后关闭流
			while(digestInputStream.read()!=-1)
				;
			digestInputStream.close();

			//当所有数据已被更新,调用digest()方法完成哈希计算,返回字节数组
			byte[] digest = instance.digest();

			//创建字符串构造器,方便字符串的操作
			StringBuilder stringBuilder = new StringBuilder(filename);
			String algorithm = instance.getAlgorithm();
			stringBuilder.append("(algorithm:"+algorithm+"):");
			//将字节数组转化成字符串
			stringBuilder.append(DatatypeConverter.printHexBinary(digest));

			//打印消息摘要结果
			System.out.println(stringBuilder.toString());

		}catch(IOException ex) {
			System.err.println(ex);
		} catch (NoSuchAlgorithmException ex) {
			System.err.println(ex);
		}
	}
}

运行实例

package date0803;

import java.io.File;

public class Test1 {

	public static void main(String[] args) {
		File file = new File("E:\\数据挖掘课程PPT");
		File[] listFiles = file.listFiles();

		//对于文件,使用绝对路径,便于查找
		for(File subfile:listFiles) {
			String absolutePath = subfile.getAbsolutePath();
			Thread fileDigestThread = new FileDigestThread(absolutePath);
			fileDigestThread.start();
		}
	}

}

运行结果

E:\数据挖掘课程PPT\4LANG.pdf(algorithm:SHA):175561E04F5A14DE82A5557C0EA036831EA5633A
E:\数据挖掘课程PPT\1intro.pdf(algorithm:SHA):0F8D1449BA7C195BF7AAADC1351ED02882F7B579
E:\数据挖掘课程PPT\3PREP.pdf(algorithm:SHA):C85278213C0D649355870E6D637D5198DD73B33B
E:\数据挖掘课程PPT\5DESC.pdf(algorithm:SHA):58A7F200CDDDA44D09E1F5514C8AA279E3E6E3FE
E:\数据挖掘课程PPT\2dw.pdf(algorithm:SHA):15D08FD207C2A680A529C7C18D847CC455E2080A
E:\数据挖掘课程PPT\7CLASS.pdf(algorithm:SHA):61CEB6DA12E75AF81EE84B15CBE2E4D23782993B
E:\数据挖掘课程PPT\8CLST.pdf(algorithm:SHA):B6AFE6FC67EE89E89860B7CF13B9550B9DCDF4FE
E:\数据挖掘课程PPT\10APPL.pdf(algorithm:SHA):8C6429D5A1DB0D8CE4DF8D9933C2A08FE0065976
E:\数据挖掘课程PPT\6ASSO.pdf(algorithm:SHA):4D04780EBB487C1AA014C631A5E5CB5305E6EE31
E:\数据挖掘课程PPT\9CMPLX.pdf(algorithm:SHA):B135431328FDC5ABC965C01B0FD126C21533F5EB
时间: 2024-08-29 18:49:15

运用Java获取消息摘要的相关文章

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

消息摘要 算法简述 定义 它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生.如果消息在途中改变了,则接收者通过对收到消息的新产生的摘要与原摘要比较,就可知道消息是否被改变了.因此消息摘要保证了消息的完整性.消息摘要采用单向Hash 函数将需加密的明文"摘要"成一串密文,这一串密文亦称为数字指纹(Finger Print).它有固定的长度,且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致.这样这串摘要便可成为验证明文是否是

Java安全之消息摘要

消息摘要又称数据指纹,主要用于数据的完整性校验,例如当你在apache下载一个jar包的时候,在下载列表中除了会提供下载链接,还会提供MD5摘要值,当你在下载完成后再对下载的文件计算摘要值,如果摘要值一致,则说明下载过程中没有发生数据丢失或更改,确保数据完整. 消息摘要的算法主要包含MD(Message Digest).SHA(Secure Hash Algorithm)和MAC(Message Authentication Code)共3大系列,也是数据签名的核心算法.MD系列包含MD2,MD

消息摘要java.security.MessageDigest

这是一种与消息认证码结合使用以确保消息完整性的技术.主要使用单向散列函数算法,可用于检验消息的完整性,和通过散列密码直接以文本形式保存等,目前广泛使用的算法有MD4.MD5.SHA-1,jdk1.5对上面都提供了支持,在java中进行消息摘要很简单, java.security.MessageDigest提供了一个简易的操作方法: /** *MessageDigestExample.java *Copyright 2005-2-16 */ import java.security.Message

HMAC加密的消息摘要码

HMAC(Hash Message Authentication Code)哈希消息授权码,它在消息摘要算法(例如MD5,SHA系列算法)的基础上,使用密钥对消息摘要进行加密.它相当于一个马甲,内里可以使用MD5,SHA1,SHA256,SHA384,SHA512等Message Digest算法,在生成的消息摘要的基础上再多一道加密的工序.所以HMAC包括,HmacMD5,HmacSHA1,HmacSHA384,HmacSHA512等种类.正是因为HMAC只是一个马甲,它才有了很大的灵活性,底

RabbitMQ Consumer获取消息的两种方式(poll,subscribe)解析

以下转自:http://blog.csdn.net/yangbutao/article/details/10395599 rabbitMQ中consumer通过建立到queue的连接,创建channel对象,通过channel通道获取message, Consumer可以声明式的以API轮询poll的方式主动从queue的获取消息,也可以通过订阅的方式被动的从Queue中消费消息, 最近翻阅了基于java的客户端的相关源码,简单做个分析. 编程模型伪代码如下: ConnectionFactory

从源码角度分析native层消息机制与java层消息机制的关联

上文从源码分析Handler机制中从java层分析了消息机制,接下来本文从native层去分析Android中的消息机制. 在一个消息驱动的系统中,最重要的就是消息队列和消息获取和处理,从上一篇文章可以看出handler的消息机制主要是靠MessageQueue进行消息列队,靠Looper进行消息循环,Looper的loop方法中进行轮询消息的实际操作还是依靠MessageQueue的next方法来获取消息,也就是说在这个消息驱动机制中最重要的就是MessageQueue这个类了.在Androi

Java异步消息平台

l  JAVA平台异步消息模块 JAVA平台异步消息模块,是一个针对RabbitMQ的消息发送及处理封装,包含消息的配置.发送.接收.失败重试.日志记录等,总共分为4个部分: 1)RabbitMQ访问封装:JAMQP(Jar包) 2)消息模块公共对象.配置读取及接口定义:JMSG(Jar包) 3)消息发送端:JMSG—Client(Jar包) 4)消息接收端:JMSG—Server(War包)   l  RabbitMQ简介 MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断的写入消息

消息摘要输出证书

package com.gxnu.study.zip; import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.nio.file.Files;import java.nio.file.Paths;import java.security.DigestInputStream;import java.security.MessageDigest;import ja

散列函数、消息摘要与数字签名

一, 散列函数(Hash function) 散列函数:任何一种能将任意大小数据映射为固定大小数据的函数,都能被称为散列函数.散列函数的返回值称为散列值.散列码,摘要或者简单散列. 也就是说散列函数能将任意长度的输入变换成固定长度的输出,该输出就是散列值.散列值空间通常远小于输入的空间. 散列函数的一些特性: 消息的长度不受限制 确定性:对于相同的输入(根据同一函数),它必须始终生成相同的散列值,如果两个散列值是不相同的,那么这两个散列值的原始输入也是不相同的, 但是对于不同的输入可能会散列成相