Java安全之消息摘要

消息摘要又称数据指纹,主要用于数据的完整性校验,例如当你在apache下载一个jar包的时候,在下载列表中除了会提供下载链接,还会提供MD5摘要值,当你在下载完成后再对下载的文件计算摘要值,如果摘要值一致,则说明下载过程中没有发生数据丢失或更改,确保数据完整。

消息摘要的算法主要包含MD(Message Digest)、SHA(Secure Hash Algorithm)和MAC(Message Authentication Code)共3大系列,也是数据签名的核心算法。MD系列包含MD2,MD4,MD5共三种算法,其中MD5最常用也最完善;SHA算法主要包含SHA-1、SHA-224、SHA-256、、SHA-384、SHA-512等,其中SHA-1最常用;MAC算法综合了上述两种算法,主要包括HmacMD5、HmacSHA1、HmacSHA256、HmacSHA384、HmacSHA512等,MAC算法综合MD5与SHA算法的优势,并加入了密钥的支持,是一种更为安全的消息摘要算法。

在应用程序中主要是为数据计算消息摘要与校验消息摘要,下面就看看在Java中是如何使用的,其入口类也称为引擎类为:java.security.MessageDigest但使用MAC算法时引擎类为:javax.crypto.Mac。

一、MD与SHA系列

public class DigestTest {

	@Test
	public void test() throws Exception {
		String myInfo = "我的测试信息";
		//参数为消息摘要算法,在Java中默认支持的算法有:MD2、MD5、SHA-1、SHA-256、SHA-384、SHA-512
		MessageDigest digest = MessageDigest.getInstance("SHA-1");
		//更新待计算摘要的数据,该方法可以调用多次,例如一个文件很大,需要分多次更新
		digest.update(myInfo.getBytes());
		//得到摘要结果
		byte[] result = digest.digest();
		//摘要其实是一段二进制数据,但为了方便人们查看,一般会将其用16进制字符串表示
		System.out.println("本信息摘要为:" + toHexString(result));

		MessageDigest md = MessageDigest.getInstance("SHA-1");
		md.update(myInfo.getBytes());
		//isEqual方法用于判断两摘要值是否一致
		if(MessageDigest.isEqual(result, md.digest())) {
			System.out.println("摘要检查正常");
		} else {
			System.out.println("非法摘要");
		}
	}

	// 二行制数据转为16进制字符串
	public static String toHexString(byte[] data) {
		StringBuilder builder = new StringBuilder();
		String stmp = "";
		for (int n = 0; n < data.length; n++) {
			stmp = (java.lang.Integer.toHexString(data[n] & 0XFF));
			if (stmp.length() == 1) {
				builder.append("0");
			}
			builder.append(stmp);
		}
		return builder.toString().toUpperCase();
	}

	@Test
	public void testDigestInputStream() throws Exception {
		MessageDigest digest = MessageDigest.getInstance("MD5");
		String value = "xtayfjpk";
		byte[] bytes = value.getBytes();
		//还可以使用DigestInputStream来自动计算消息摘要,只要是从DigestInputStream流中读取的数据,
		//都会更新到MessageDigest中,相当于间接调用了MessageDigest的update方法
		DigestInputStream stream = new DigestInputStream(new ByteArrayInputStream(bytes), digest);
		//一定要开启,默认为开启
		stream.on(true);
		stream.read(bytes);
		byte[] result = stream.getMessageDigest().digest();
		System.out.println(toHexString(result));
		stream.close();
	}

	@Test
	public void testDigestOutStream() throws Exception {
		MessageDigest digest = MessageDigest.getInstance("MD5");
		String value = "xtayfjpk";
		byte[] bytes = value.getBytes();
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		//与DigestInputStream相似,只不过使用DigestOutputStream时是从其流出的数据都会更新到MessageDigest中
		DigestOutputStream stream = new DigestOutputStream(baos, digest);
		//一定要开启,默认为开启
		stream.on(true);
		stream.write(bytes);
		byte[] result = stream.getMessageDigest().digest();
		System.out.println(SecurityUtils.toHexString(result));
		stream.close();
	}
}

二、MAC系列

@Test
public void testMac() throws Exception {
	String myInfo = "我的测试信息";
	Mac digest = Mac.getInstance("HmacSHA512");
	//获取密钥生成器,AES为密钥算法
	KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
	//用生成的密钥进行初始化
	digest.init(keyGenerator.generateKey());
	//更新待计算摘要数据
	digest.update(myInfo.getBytes());
	//得到摘要结果
	byte[] result = digest.doFinal();
	System.out.println("本信息摘要为:" + toHexString(result));

}
时间: 2024-11-06 07:20:50

Java安全之消息摘要的相关文章

消息摘要java.security.MessageDigest

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

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

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

运用Java获取消息摘要

消息摘要简单介绍 消息摘要算法的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文.消息摘要算法不存在密钥的管理与分发问题,适合于分布式网络相同上使用.由于其加密计算的工作量相当可观,所以以前的这种算法通常只用于数据量有限的情况下的加密,例如计算机的口令就是用不可逆加密算法加密的.近年来,随着计算机相同性能的飞速改善,加密速度不再成为限制这种加密技术发展的桎梏,因而消息摘要算法应用的领域不断增加.现在,消息摘要算法主要应用在

HMAC加密的消息摘要码

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

消息摘要输出证书

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

Oracle触发器如何调用Java实现Openfire消息发送

写在前面,要想实现整个过程的成功执行请先准备以下文件: 1. 登陆Openfire服务端以及Spark客户端相关程序(openfire_4_0_1.exe.spark_2_7_6.exe) 2. 连接Openfire和Oracle相关的jar包(presence.jar.smack.jar.smackx-debug.jar.smackx.jar.ojdbc.jar)  Step1:安装Openfire服务端并配置数据库连接,配置参考<Openfire服务器安装与配置教程> Step2:在Ecl

JAVA web实时消息服务器后台推送技术方案---GoEasy

Goeasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送!个人感觉goeasy推送更稳定,推送速度快,代码简单易懂上手快浏览器兼容性:GoEasy推送支持websocket 和polling两种连接方式,从而可以支持IE6及其以上的所有版本,同时还支持其它浏览器诸如Firefox, Chrome, Safari 等等.支 持不同的开发语言:   GoEasy推送提供了Restful API接口,无论你的后台程序用的是哪种语言都可以通过RestfulAPI来实现后台实时推送.

Java IO(章节摘要)

1,Java IO中各类间的继承关系(如图所示). 2,在Java中使用File类表示文件本身,可以直接使用此类完成文件的各种操作,如创建,删除等. 3,RandomAccessFile类可以从指定的位置开始读取信息,但是要求文件中各个数据的保存长度必须固定. 4,输入/输出流主要分为字节流(OutputStream,InputStream)和字符流(Writer,Reader)两种,但是在传输中以字节流操作较多,字符流在操作时使用到缓冲区,而字节流没有使用到缓 冲区. 5,字节或字符流都是以抽