密码学学习六-消息摘要

1 说明

  • 消息摘要(Message Digest)又称为数字摘要(Digital Digest)
  • 它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生
  • 使用数字摘要生成的值是不可以篡改的,为了保证文件或者值的安全

2 特点

无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。例如应用MD5算法摘要的消息有128个比特位,用SHA-1算法摘要的消息最终有160比特位的输出

只要输入的消息不同,对其进行摘要以后产生的摘要消息也必不相同;但相同的输入必会产生相同的输出

消息摘要是单向、不可逆的

常见算法有MD5、SHA-1、SHA-256、SHA-512

3 作用

消息摘要通常作为检查文件是否被篡改

百度搜索 tomcat ,进入官网下载 ,会经常发现有 sha1sha512 , 这些都是数字摘要

点击sha1查看

把下载下来的文件生成消息摘要,然后和官网消息摘要比对,如果生成的摘要一致则说明没被篡改

4 获取字符串和文件的消息摘要(java)

import org.junit.Test;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.security.MessageDigest;

/**
 * @author huwenlong
 * @date 2020/9/20 10:52
 */
public class Digest {

    @Test
    public void testGetDigest() throws Exception {
        System.out.println(getDigest("MD5", "aa"));
        System.out.println(getDigest("SHA-1", "aa"));
        System.out.println(getDigest("SHA-256", "aa"));
        System.out.println(getDigest("SHA-512", "aa"));
//        4124bc0a9335c27f086f24ba207a4912
//        e0c9035898dd52fc65c41454cec9c4d2611bfb37
//        961b6dd3ede3cb8ecbaacbd68de040cd78eb2ed5889130cceb4c49268ea4d506
//        f6c5600ed1dbdcfdf829081f5417dccbbd2b9288e0b427e65c8cf67e274b69009cd142475e15304f599f429f260a661b5df4de26746459a3cef7f32006e5d1c1
    }

    @Test
    public void testGetFileDigest() throws Exception {
        System.out.println(getFileDigest("pom.xml", "MD5"));
        System.out.println(getFileDigest("pom.xml", "SHA-1"));
        System.out.println(getFileDigest("pom.xml", "SHA-256"));
        System.out.println(getFileDigest("pom.xml", "SHA-512"));
//        f5cc3f05d6afd3e45a7e570899187d24
//        b9c1e8fbbe89892f5d7a65343c3e096724582309
//        1d7e6817e58cbf3be454f0f39b70e371c9bdce4bbc4ff237c7af681b07ca998d
//        49bd8715802a602808ccdeadac5a0ef712078d394bde1918b82a8620e07ac4de5c534b15aadce194de346342b400f63884e80a8fa8f979ac50b26caccef9f20d
    }

    public String getFileDigest(String filePath, String type) throws Exception {
        FileInputStream fis = new FileInputStream(filePath);
        int len;
        byte[] buffer = new byte[1024];
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        while ((len = fis.read(buffer)) != -1) {
            baos.write(buffer, 0, len);
        }
        // 获取消息摘要对象
        MessageDigest messageDigest = MessageDigest.getInstance(type);
        // 获取消息摘要
        byte[] digest = messageDigest.digest(baos.toByteArray());
        return toHex(digest);
    }

    public String getDigest(String type, String str) throws Exception {
        MessageDigest messageDigest = MessageDigest.getInstance(type);
        byte[] bytes = messageDigest.digest(str.getBytes());
        return toHex(bytes);
    }

    private String toHex(byte[] bytes) {
        StringBuilder builder = new StringBuilder();
        for (byte b : bytes) {
            // 消息摘要进行表示的时候,是用16进制进行表示
            String hex = Integer.toHexString(b & 0xFF);
            if (hex.length() == 1) {
                // 保持数据的完整性,前面不够的用0补齐
                hex = '0' + hex;
            }
            builder.append(hex);
        }
        return builder.toString();
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值