Java加密解密之消息摘要

消息摘要,也叫数字摘要。它是一种单向的,不可逆的加密算法。
发送方:采用单向hash函数对消息进行计算,得到摘要。发送消息和摘要。
接收方:把接收的消息,按着同样的hash函数计算,新产生的摘要和发送来的原摘要进行对比。如果2个摘要不一致,说明消息不完整了。


消息摘要的特点:
1、无论输入的消息有多长,计算出来的摘要长度是固定的。
2、相同的消息,计算出来的摘要相同。不同的消息,计算出来的摘要有可能相同
3、消息摘要是单向、不可逆的。从计算出的摘要中,不能逆向得到消息内容。


消息摘要的作用:

数据签名, 数据完整性校验等


消息摘要常见的算法有:MD2、MD5、SHA-1、SHA-256 等


现在很多下载网站都提供了有消息摘要,用户校验数据的完整性。

比如说,Apache Tomcat下载就提供了基于MD5、sha1的消息摘要

https://www.apache.org/dist/tomcat/tomcat-8/v8.5.23/bin/apache-tomcat-8.5.23.zip.md5


https://www.apache.org/dist/tomcat/tomcat-8/v8.5.23/bin/apache-tomcat-8.5.23.zip.sha1


我们下载了apache-tomcat-8.5.23.zip之后,就可以对文件进行消息摘要。然后用自己计算出的摘要结果和网站上的进行对比。如果一致,说明文件没有被修改。

下面使用Java(1.8.0_144)演示计算apache-tomcat-8.5.23.zip文件的消息摘要

package com.security.dgst;

import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import org.apache.commons.codec.binary.Hex;

public class MessageDigestTest {
	
	/**
	 * 其中,algorithm支持的算法有:MD2、MD5、SHA-1、SHA-256 等
	 * 全部支持的算法见官方文档:
	 * https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#MessageDigest
	 */
	public static byte[] messageDigest(String algorithm, byte[] data) throws NoSuchAlgorithmException {
		MessageDigest md = MessageDigest.getInstance(algorithm);
		
		byte[] digest = md.digest(data);
		
		return digest;
	}
	
	public static void main(String[] args) throws Exception {
		byte[] data = Files.readAllBytes(Paths.get("c:/tmp/apache-tomcat-8.5.23.zip"));
		
		//使用MD5算法计算摘要
		byte[] md5Digest = messageDigest("MD5", data);
		
		//使用SHA1算法计算摘要
		byte[] sha1Digest = messageDigest("SHA-1", data);
		
		//把摘要后的结果转换成十六进制的字符串(也可以使用Base64进行编码)
		System.out.println(Hex.encodeHexString(md5Digest));
		System.out.println(Hex.encodeHexString(sha1Digest));
	}
}

输出结果为:

8d9e7a75906efdec83db73ae2b4204c5
a0141bec66a4c6660a2f1c1b4c89533845c88161 
对比网站提供的结果,发现一致。说明下载的文件没有被篡改。


上面的,MessageDigest.getInstance(algorithm)  参数algorithm可以支持的值除了参考官方文档,还可以通过如下代码得出

Security.getAlgorithms("MessageDigest").forEach(System.out::println);
在Java8中,输出结果如下:


SHA-384
SHA-224
SHA-256
MD2
SHA
SHA-512
MD5


同样的,我们也可以使用OpenSSL进行消息摘要,


对比发现,结果一样




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值