蜗牛大师

吴庆龙的学习笔记

导航

消息摘要(MessageDigest)

一、概述

消息摘要主要是验证数据的完整性,正确性。消息摘要都是16进制的,所以计算出来的 byte 数组,需要转为16进制显示。
消息摘要不是加密算法,计算摘要的时候会丢失很多数据,具有不可逆性。生成摘要的长度根据算法的不同而不同。
一个好的摘要算法,是极难产生Hash碰撞的。
 
MD5 不安全不是因为可以通过结果反推回去,也不可能反推回去,因为计算结果时就已经丢掉了大量的数据,而是因为有库可以查询明文和密文的映射(彩虹表),比如著名的网站:https://www.cmd5.com,就可以查询,还有就是 MD5 无法防止碰撞。
 

二、使用方式

比如,Tomcat 的下载页面如下:
发现每个下载项后都跟随着(pgp,sha512),这就是消息摘要,文件下载完后计算其sha512的值,然后与这里的sha512的值做对比,如果一直,说明你下载的文件没问题。
 
下面是对比示例代码:
import java.io.FileInputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
 
/**
* SHA家族的五个算法:SHA-1、SHA-224、SHA-256、SHA-384、SHA-512。
* 由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布;是美国的政府标准。
* 后四者有时并称为SHA-2(SHA-224、SHA-256、SHA-384、SHA-512)。
*
* JDK11支持的有:
* 1、SHA
* 2、SHA-224
* 3、SHA-256
* 4、SHA-384
* 5、SHA-512
* 6、SHA-512/224
* 7、SHA-512/256
* 8、SHA3-224
* 9、SHA3-256
* 10、SHA3-384
* 11、SHA3-512
*
* @author WuQinglong
* @date 2021/1/18 16:10
*/
public class SHAMain {
 
    public static void main(String[] args) throws NoSuchAlgorithmException, IOException {
        // 下载页面的 sha512 的值
        String sha512 = "20029f00a64627a0fe9e6b86550d5244418e40cf933ba7ea985713e6cf638b8e13e16b0e3265a5fba1f0c7440e718e42ade4a10fc16d820bb801be1ac4a2aa5d";
        // 将文件读取成 byte 数组
        FileInputStream fis = new FileInputStream("/Users/wu/Downloads/apache-tomcat-9.0.41.zip”);
        // 在 JDK8 中没有 readAllBytes 方法
        byte[] bytes = fis.readAllBytes();
 
        // 计算 sha512 摘要
        MessageDigest messageDigest = MessageDigest.getInstance("SHA-512");
        messageDigest.update(bytes);
        byte[] result = messageDigest.digest();
        // 转 16 进制表示
        String encodeResult= new BigInteger(1, result).toString(16);
        if (sha512.equals(encodeResult)) {
            System.out.println("文件完整");
        } else {
            System.out.println("文件不完整");
        }
    }
 
}
 
在 Java 中消息摘要的计算方式就是这个格式,如果想使用 MD5 计算的话,只需要改为 MessageDigest.getInstance("MD5”); 即可。 

posted on 2021-02-04 15:46  蜗牛大师  阅读(891)  评论(0编辑  收藏  举报