密码学【java】初探究加密方式之消息摘要

news2024/11/17 20:35:24

文章目录

  • 一 消息摘要
    • 1.1 消息摘要的特点
    • 1.2 消息摘要常见算法
    • 1.3 数字摘要的运用举例:
    • 1.4 字符串数字摘要演示
    • 1.5 其他数字摘要算法演示
    • 1.6 获取文件消息摘要

一 消息摘要

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

1.1 消息摘要的特点

  • **无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。**例如应用MD5算法摘要的消息有128个比特位,用SHA-1算法摘要的消息最终有160比特位的输出
  • 只要输入的消息不同,对其进行摘要以后产生的摘要消息也必不相同;但相同的输入必会产生相同的输出。换句话说,消息摘要的输入和输入信息有一一对应的特性。
  • 消息摘要是单向,不可逆的

1.2 消息摘要常见算法

在这里插入图片描述

  • SHA512在线签名和解密网站
  • 消息摘要生成工具
  • 总结:
    • MD5算法 : 摘要结果16个字节, 转16进制后32个字节
    • SHA1算法 : 摘要结果20个字节, 转16进制后40个字节
    • SHA256算法 : 摘要结果32个字节, 转16进制后64个字节
    • SHA512算法 : 摘要结果64个字节, 转16进制后128个字节

  • MD5(Message-Digest Algorithm)
    • MD5信息摘要算法,一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。
    • MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。
    • 该算法存在弱点,可以被加以破解,对于需要高度安全性的数据,一般建议改用其他算法,如SHA-2。MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。

  • SHA1(英语:Secure Hash Algorithm 1,中文名:安全散列算法1)
    • SHA-1是一种密码散列函数,美国国家安全局设计,并由美国国家标准技术研究所(NIST)发布为联邦数据处理标准(FIPS)。
    • SHA-1可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数。

  • SHA256(Secure Hash Algorithm 2,安全哈希算法2)
    • SHA-256作为SHA-2的一部分,目前已经是最流行的哈希算法之一。
    • 安全签名算法通过将输入文本拆分成独立的片段,并通过这些独立的片段生成最终的结果——签名算法哈希值。这些签名算法哈希值几乎是唯一的字符串,因而它们往往被用作数据块的摘要"digest",指纹"figerprint"或签名"signature"。
    • SHA-256算法往往被用来生成256位的签名。

  • SHA512
    • sha512是一种哈希算法,对给定的数据执行哈希函数。
    • 由上图可知,它是一组称为SHA2的哈希算法的一部分。
    • sha512是哈希大家庭里中的一个,哈希都有不可逆的特性。可以把理解为无法解密的签名。更准确来说,在原则上,sha512是无法反向解密的,但是对于简单的,常见的密码,有人会将结果保存下来,当你输入签名后的哈希值时,如果可以查询到原密码,则解码成功。但是相对于复杂的密码来说,由于SHA系列算法的数据摘要长度较长,因此其运算速度与MD5相比,也相对较慢。 不管是 SHA384还是SHA512,都是不可逆的,原则上是无法解密的。
    • sha512具有不随机性,拿同一个密码生成的结果永远不会变。将C(密码)进行签名,得出D(结果)只要C不变,算法不变,次数不变,结果D是不变的。

1.3 数字摘要的运用举例:

  • 在tomcat的官网下载界面,在下载连接的后面就有数字摘要的身影。

  • 当点击相应的数字摘要连接,会展示该文件生成的结果。该算法在修改文件名称时,并不会影响签名运算的结果。所以,我们可以在本地对文件进行相应的签名运算后,与官方网站的内容进行对比,来验证下载文件是否被篡改或损坏。
    在这里插入图片描述

  • 这里采用64位win版进行验证,java代码如下:

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

public class DigestDemo2 {
    public static void main(String[] args) throws Exception {
    	//将下载的tomcat文件放到src目录下  
        String sha512 = getDigestFile("src/apache-tomcat-11.0.0-M5-windows-x64.zip", "SHA-512");
        System.out.println(sha512);
    }
    /**
     * 获取文件的数字摘要
     * @param filePath 表示文件的路径
     * @param algorithm 表示算法
     * @return
     */
    private static String getDigestFile(String filePath, String algorithm) throws Exception{
        // 通过io流的方式读取文件
        //注意:FileInputStream默认情况目录为项目的根目录
        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 digest = MessageDigest.getInstance(algorithm);
        // 执行消息摘要算法
        byte[] digest1 = digest.digest(baos.toByteArray());

        return toHex(digest1);
    }

    private static String toHex(byte[] digest) {
        StringBuilder sb = new StringBuilder();
        // 对密文进行迭代
        for (byte b : digest) {
            // 把密文转换成16进制
            String s = Integer.toHexString(b & 0xff);
            // 判断如果密文的长度是1,需要在高位进行补0
            if (s.length() == 1){
                s = "0"+s;
            }
            sb.append(s);
        }
        // 使用base64进行转码
        return sb.toString();
    }
}

在这里插入图片描述
在这里插入图片描述

1.4 字符串数字摘要演示

  1. 注意的点:
    1. 请使用org.apache.commons.codec.binary.Base64;类进行计算,需要导入的maven依赖为
    <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>1.15</version>
    </dependency>
    
    1. 在线网站的结果不是使用64进行编码,而使用16进制进行展示
    2. 验证计算结果
    • 在线网站的计算结果
      在这里插入图片描述
    • 本地计算结果
      在这里插入图片描述

1.5 其他数字摘要算法演示

import java.security.MessageDigest;

public class DigestDemo04 {
    public static void main(String[] args) throws Exception{
        // 原文
        String input = "天道酬勤";
        // 获取数字摘要对象
        String md5 = getDigest(input, "MD5");
        System.out.println(md5);

        String sha1 = getDigest(input, "SHA-1");
        System.out.println(sha1);

        String sha256 = getDigest(input, "SHA-256");
        System.out.println(sha256);

        String sha512 = getDigest(input, "SHA-512");
        System.out.println(sha512);


    }

    private static String getDigest(String input, String algorithm) throws Exception {
        MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
        // 消息数字摘要
        byte[] digest = messageDigest.digest(input.getBytes());
        System.out.println("密文的字节长度:" + digest.length);

        return toHex(digest);
    }

    private static String toHex(byte[] digest) throws Exception {

        // 创建对象用来拼接
        StringBuilder sb = new StringBuilder();

        for (byte b : digest) {
            // 转成 16进制
            String s = Integer.toHexString(b & 0xff);
            if (s.length() == 1){
                // 如果生成的字符只有一个,前面补0
                s = "0"+s;
            }
            sb.append(s);
        }
        System.out.println("16进制数据的长度:" + sb.toString().getBytes().length);
        return sb.toString();
    }

}
密文的字节长度:16
16进制数据的长度:32
d34ba38f8eb58109f5ba1ec4e0154517
密文的字节长度:20
16进制数据的长度:40
15313a15333413679c6b98e92b9b2770c3ca8b0b
密文的字节长度:32
16进制数据的长度:64
01afda71911617c438fe1e4e645affa70eebe693458731ce6eb8e9cec479288f
密文的字节长度:64
16进制数据的长度:128
396d16c3d8c03661d656f69c45da0d46f9aa02edd00a954da8960fe139f395d86f336d0a61d47932865e36cd56ed2d6e58e91f720d1523caa13bdedc124f35de

1.6 获取文件消息摘要

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

public class DigestDemo05 {
    public static void main(String[] args) throws Exception{
        String input = "aa";
        String algorithm = "MD5";

        // sha1 可以实现秒传功能

        String sha5121 = getDigestFile("src/apache-tomcat-11.0.0-M5-windows-x64.zip", "SHA-512");
        System.out.println(sha5121);

        String sha5122 = getDigestFile("src/apache-tomcat-11.0.0.zip", "SHA-512");
        System.out.println(sha5122);

        String md5 = getDigest("aa", "MD5");
        System.out.println(md5);

        String md51 = getDigest("aa ", "MD5");
        System.out.println(md51);
    }

    private static String getDigestFile(String filePath, String algorithm) 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(algorithm);
        // 获取消息摘要
        byte[] digest = messageDigest.digest(baos.toByteArray());
        System.out.println("密文的字节长度:"+digest.length);
        return toHex(digest);
    }

    private static String getDigest(String input, String algorithm) throws Exception{
        MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
        byte[] digest = messageDigest.digest(input.getBytes());
        System.out.println("密文的字节长度:"+digest.length);
        return toHex(digest);
    }

    private static String toHex(byte[] digest) {
        // 消息摘要进行表示的时候,是用16进制进行表示
        StringBuilder sb = new StringBuilder();
        for (byte b : digest) {
            // 转成16进制
            String s = Integer.toHexString(b & 0xff);
            // 保持数据的完整性,前面不够的用0补齐
            if (s.length()==1){
                s="0"+s;
            }
            sb.append(s);
        }
        System.out.println("16进制数据的长度:"+ sb.toString().getBytes().length);
        return sb.toString();
    }
}

  • 结论1:改变文件名称,摘要结果不会改变!
    在这里插入图片描述
  • 结论2:改变原文,摘要结果改变
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/492896.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Feign组件的使用及开发中使用方式

在微服务的服务集群中服务与服务之间需要调用暴露的服务.那么就需要在服务内部发送http请求&#xff0c; 我们可以使用较为老的HttpClient实现&#xff0c;也可以使用SpringCloud提供的RestTemplate类调用对应的方法来发送对应的请求。 说明&#xff1a; 现在有两个微服务一个是…

java反序列化cc3链分析

前言 休息完五一&#xff0c;继续卷&#xff0c;原本想结束cc链的&#xff0c;但是发现cc3链好像用的方法不太一样&#xff0c;感觉也是可以记录下来&#xff0c;这里感觉cc3链有一些像cc1链的变种&#xff0c;就像是给你一些绕过的操作 在说一句&#xff0c;白日梦组长永远的神…

使用开源的zip.cpp和unzip.cpp实现压缩包的创建与解压

目录 1、使用场景 2、压缩包的创建 3、压缩包的解压 4、CloseZipZ和CloseZipU两接口的区别 5、开源zip.cpp和unzip.cpp文件的下载 VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&#xff09;https://blog.csdn.net/chenlycly/…

低代码平台组件间事件交互

事件的分类 我们主要依托于事件来进行组件间的交互。为了满足组件与组件、组件与系统、组件与服务端的交互&#xff0c;我们大致可以将事件分为三个类别&#xff1a; 组件方法&#xff1a;每个组件都会暴露出一些方法供其他组件进行调用。例如表格组件&#xff0c;我们可以暴…

Ubuntu18.04 设置 root 用户登录

Ubuntu18.04 设置 root 用户登录 1 设置 root 密码2 设置 root 登录 1 设置 root 密码 Ubuntu 安装后&#xff0c;root 用户默认是被锁定的&#xff0c;无法登录。Ubuntu 默认的 root 密码是动态随机的&#xff0c;我们的系统每次启动后都是不一样的&#xff0c;那么要使用 ro…

【滤波】多元高斯

本文主要翻译自rlabbe/Kalman-and-Bayesian-Filters-in-Python的第5章节05-Multivariate-Gaussians&#xff08;多元高斯&#xff09;。 %matplotlib inline#format the book import book_format book_format.set_style()简介 上一篇文章中的技术非常强大&#xff0c;但它们只…

[chapter 31][PyTorch][Early Stop Dropout]

前言 深度神经网络结构的过拟合是指 : 在训练集上的正确率很高, 但在测试集上的准确率很低. 为了缓解网络过拟合的问题, 其中一种常见的办法是使用 dropout ,Early Stop 目录&#xff1a; 1&#xff1a; Early Stop 2: Dropout 3: stochastic Gradient Descent 一 Earl…

平面设计师都在用的设计素材网站,免费下载~

很多新手设计师不知道去哪里找高清、免费的设计素材&#xff0c;今天我就给大家推荐5个设计素材网站&#xff0c;免费下载&#xff0c;赶紧收藏起来把&#xff01; 1、菜鸟图库 https://www.sucai999.com/?vNTYwNDUx 菜鸟图库是我推荐过很多次的网站&#xff0c;主要是站内素…

白宫召见科技巨头 讨论AI潜在风险 以确保人们从创新中受益

ChatGPT的问世&#xff0c;被认为是通用人工智能发展的“奇点”和强人工智能即将到来的“拐点”&#xff0c;甚至有业内人士推测所有数字化系统和各个行业都可能被其重新“洗牌”。 乐观主义者表示&#xff0c;人工智能的核心是对人类大脑的模拟&#xff0c;其目的是延伸和增强…

C++Primer 第一章

C概述 程序的组成 数据的集合算法的集合 面向对象编程:我们通过一组数据抽象来建立问题的模型,简单来说就是把一些数据封装起来,就是我们类 面向过程编程:一个问题可直接由一组算法来建立模型 第一章 开始 1.1 问题的解决 这里有一个简单的例子来让我们看看如何设计编程思路…

C++ 的类型转换

目录 1. C语言中的类型转换 2. C强制类型转换 2.1static_cast 2.2 reinterpret_cast 2.3 const_cast 2.4 dynamic_cast 3. RTTI&#xff08;了解&#xff09; 1. C语言中的类型转换 在 C 语言中&#xff0c;如果 赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不…

华为OD机试真题-扑克牌大小【2023】【JAVA】

一、题目描述 扑克牌游戏大家应该都比较熟悉了&#xff0c;一副牌由54张组成&#xff0c;含3~A、2各4张&#xff0c;小王1张&#xff0c;大王1张。牌面从小到大用如下字符和字符串表示&#xff08;其中&#xff0c;小写joker表示小王&#xff0c;大写JOKER表示大王&#xff09…

【linux的学习】

文章目录 linux的学习一、工具安装与联网&#xff1f;二、Linux软件安装1.安装jdk2.安装MySQL2.读入数据 总结 linux的学习 一、工具安装与联网&#xff1f; 1.1安装好VM后 进入vi /etc/sysconfig/network-scripts/ifcfg-ens33 然后ip addr 查看ip 1.2打开IDEA的tools 二、…

Jpeg算法

Jpeg算法&#xff1a; JPEG会分析图片的各个部分找到并删除人眼不易察觉的元素。使用jpeg算法的时候可以选一个叫’质量’的可变数值来决定压缩的程度&#xff0c;压缩过多的时候我们会得到有缺陷的方框&#xff0c;叫做膺像。 压缩算法之所以有用的原因&#xff1a;人的眼睛并…

Linux开发工具大全 - 软件包管理器yum | vim编辑器 | gcc/g++编译器 | 自动化构建工具Make/Makefile | gdb调试工具

目录 Ⅰ. Linux 软件包管理器 yum 一、yum 背景知识 二、yum 的基本使用 1、查看软件包 2、软件包名称构成 3、安装软件 4、卸载软件 Ⅱ.vim编辑器 一、认识vim 1、vim概念 2、模式及其切换 二、vim使用 1、vim的指令&#xff08;重要&#xff09; 命令模式 插…

PCB表面处理方式详解

上一篇文章中介绍了关于PCB设计中的常用基本概念&#xff0c;那么本篇文章就挑选其中的第三点【表面处理】&#xff0c;给大家展开说一说&#xff0c;顺便也自我温习一下。 什么是表面处理&#xff1f; 由于铜长期与空气接触会使得铜氧化&#xff0c;所以我们需要在PCB表面做一…

【毕业设计】基于springboot的大学生综合素质测评管理系统

目录 前言介绍综合素质测评表特色功能页面展示一&#xff0e;开发环境1.JDK配置2.安装IDEA3.MySQL安装 二&#xff0e;项目导入和配置三&#xff0e;数据库配置1.创建数据库2.修改项目数据库配置 四&#xff0e;项目部署1.项目启动2.项目访问 在线体验其他类似系统关于我 前言 …

UDP协议介绍

文章目录 一、端口号二、UDP协议1.UDP协议格式2.UDP协议的特点3.UDP缓冲区 三、UDP注意事项 一、端口号 端口号是在网络中标识一台主机上进行通信程序的唯一性的&#xff0c;在TCP/IP协议中&#xff0c;用源IP、源端口号、目的IP、目的端口号、协议号这样一个五元组来标识一个…

Android Studio Flamingo | 2022.2.1 Patch 1(火烈鸟版本)

版本概况 Android Studio Flamingo | 2022.2.1 Patch 1 Build #AI-222.4459.24.2221.9971841, built on April 20, 2023 Runtime version: 17.0.60-b2043.56-9586694 amd64 VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o. Windows 11 10.0 GC: G1 Young Generation, G1 Old…

LLMs 记忆体全新升级:六大新功能全面出击,用户体验值拉满!

LLMs 时代之下&#xff0c;CVP Stack 必不可少。 其中&#xff0c;C 代表以 ChatGPT 为代表的大模型&#xff0c;它在 AI 程序中充当中央处理器的角色&#xff1b;V 代表 Vector Database&#xff0c;即以 Zilliz Cloud 和 Milvus 为代表的向量数据库&#xff0c;为大模型提供知…