消息摘要(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”); 即可。
------------------------------我是博客签名------------------------------
座右铭:不要因为知识简单就忽略,不积跬步无以至千里。
版权声明:自由转载-非商用-非衍生-保持署名。
本作品采用知识共享署名 4.0 国际许可协议进行许可。
----------------------------------------------------------------------
座右铭:不要因为知识简单就忽略,不积跬步无以至千里。
版权声明:自由转载-非商用-非衍生-保持署名。
本作品采用知识共享署名 4.0 国际许可协议进行许可。
----------------------------------------------------------------------