服务器文件上传使用MD5实现文件校验和

MD5(Message-Digest Algorithm 5)是一种常用的哈希函数,用于生成一个128位(16字节)的哈希值(散列值),用于验证数据完整性。MD5求校验和的原理可以分为以下几个步骤:

1. 填充(Padding)

首先,将输入消息填充到长度满足 448 mod 512(即长度对512取模后等于448)。填充方式是先加一个1,然后加若干个0,直到满足长度条件。最后,将消息的原始长度以64位表示,附加到消息末尾。填充后的消息长度总是512的倍数。

2. 初始化MD缓冲区

MD5算法使用四个32位的变量来存储中间结果和最终结果,分别是:A, B, C, D。初始值为:

A = 0x67452301
B = 0xEFCDAB89
C = 0x98BADCFE
D = 0x10325476

3. 处理消息分块

消息被分割成长度为512位(64字节)的分块,每个分块进一步被分割成16个32位的小块。对于每个分块,MD5进行64轮的处理,每轮使用不同的非线性函数、常数和当前分块中的一个子块。

4. MD5的四个非线性函数

MD5使用四个非线性函数,分别是:

F(X,Y,Z) = (X & Y) | (~X & Z)
G(X,Y,Z) = (X & Z) | (Y & ~Z)
H(X,Y,Z) = X ^ Y ^ Z
I(X,Y,Z) = Y ^ (X | ~Z)

5. 主循环

对于每一个512位的分块,执行以下步骤:

  • 复制A, B, C, D到a, b, c, d
  • 执行64次操作,每次操作更新a, b, c, d的值

每次操作包括:

  1. 将a, b, c, d与当前分块中的一个子块、一个常数和一个非线性函数的结果相加
  2. 将结果循环左移若干位
  3. 更新a, b, c, d的值

操作结束后,将a, b, c, d的值分别加到A, B, C, D中。

6. 输出

所有的分块处理完毕后,A, B, C, D的值即为消息的MD5校验和。这四个32位的变量连接在一起,形成一个128位的哈希值。

总结

MD5通过一系列复杂的位操作和非线性函数,将输入消息变换成一个固定长度的哈希值。尽管MD5算法曾经被广泛使用,但由于其碰撞和安全性问题,目前在安全领域中,SHA-256等更强的哈希函数逐渐取代了MD5。然而,MD5仍然在一些非安全应用中使用,例如文件完整性校验。

下面是一个用Java实现计算文件MD5校验和的示例代码:

import java.io.FileInputStream;
import java.io.InputStream;
import java.security.MessageDigest;public class MD5Checksum {public static void main(String[] args) {try {String filePath = "path/to/your/file";String checksum = getMD5Checksum(filePath);System.out.println("MD5 Checksum: " + checksum);} catch (Exception e) {e.printStackTrace();}}public static String getMD5Checksum(String filePath) throws Exception {// 创建MD5算法实例MessageDigest md = MessageDigest.getInstance("MD5");// 创建文件输入流InputStream fis = new FileInputStream(filePath);// 创建缓冲区byte[] buffer = new byte[1024];int bytesRead;// 读取文件并更新MD5摘要while ((bytesRead = fis.read(buffer)) != -1) {md.update(buffer, 0, bytesRead);}// 关闭文件输入流fis.close();// 获取最终的MD5摘要字节数组byte[] mdBytes = md.digest();// 将字节数组转换为十六进制字符串StringBuilder hexString = new StringBuilder();for (byte mdByte : mdBytes) {String hex = Integer.toHexString(0xff & mdByte);if (hex.length() == 1) {hexString.append('0');}hexString.append(hex);}return hexString.toString();}
}

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

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

相关文章

AV1技术学习:Quantization

量化是对变换系数进行,并将量化索引熵编码。AV1的量化参数 QP 的取值范围是0 ~ 255。 一、Quantization Step Size 在给定的 QP 下,DC 系数的量化步长小于 AC 系数的量化步长。DC 系数和 AC 系数从 QP 到量化步长的映射如下图所示。当 QP 为 0 时&…

React 官方文档学习笔记

Address:React 中文文档(Beta 版) | React 中文文档 | React 中文网 (bootcss.com);快速入门 – React 中文文档 (docschina.org) Date:2024-07-18 注:该文章中与 Vue 通用的概念已被略过,仅作为学习 React 新概念的笔记总结。 1. 快速入门 学习 React 的基本概念。 2…

qt初入门8:下拉框,输入框模糊查询,提示简单了解 (借助QCompleter)

实现一个简单的模糊查询的逻辑,输入框能提示相关项。 主要借助qt的QCompleter 类( Qt 框架中提供的一个用于自动补全和模糊搜索的类),结合一些控件,比如QComboBox和QLineEdit,实现模糊查询的功能。 1&…

Python实现Java mybatis-plus 产生的SQL自动化测试SQL速度和判断SQL是否走索引

Python实现Java mybatis-plus 产生的SQL自动化测试SQL速度和判断SQL是否走索引 文件目录如下 │ sql_speed_test.py │ ├─input │ data-report_in_visit_20240704.log │ resource_in_sso_20240704.log │ └─outputdata-report_in_visit_20240704.cs…

科普文:百度交易中台之系统对账篇

百度交易中台作为集团移动生态战略的基础设施,面向收银交易与清分结算场景,赋能业务、提供高效交易生态搭建。目前支持百度体系内多个产品线,主要包括:度小店、小程序、地图打车、文心一言等。本文主要介绍了百度交易中台的交易链…

海康威视综合安防管理平台 detection 前台RCE漏洞复现

0x01 产品简介 海康威视综合安防管理平台是一套“集成化”、“智能化”的平台,通过接入视频监控、一卡通、停车场、报警检测等系统的设备。海康威视集成化综合管理软件平台,可以对接入的视频监控点集中管理,实现统一部署、统一配置、统一管理和统一调度。 0x02 漏洞概述 海康…

总结——TI_音频信号分析仪

一、简介 设备:MSPM0G3507 库:CMSIS-DSP TI 数据分析:FFT 软件:CCS CLion MATLAB 目的:对音频信号进行采样(滤波偏置处理),通过FFT获取信号的频率成分&am…

每天一个数据分析题(四百四十二)- 标签与指标

数据分析师在工作中常常会涉及两个概念:标签、指标,下面关于标签与指标的描述正确的是()? A. 指标通常可以量化,但是标签一般是不可量化的 B. 标签是用来定义、评价和描述特定事物的一种标准或方式 C. 指…

keras框架的to_categorical方法

在阅读keras的中文文档时候,对于这里的代码不了解 y_train keras.utils.to_categorical(np.random.randint(10, size(1000, 1)), num_classes10)这里应该拆分为两部分看待 第一个是np.random.randint() 查看numpy文档知道: random.randint ( low , hi…

AWS DMS MySQL为源端,如何在更改分区的时候避免报错

问题描述: 文档[1]中描述MySQL compatible Databases作为DMS任务的源端,不支持MySQL 分区表的 DDL 更改。 在源端MySQL进行分区添加时,日志里会出现如下报错: [SOURCE_CAPTURE ]W: Cannot change partition in table members…

java thread怎么保证线程按顺序执行?如何实现线程排队?

在Java中,通常不保证多个线程按特定顺序执行,因为线程的调度是由操作系统管理的,并且是不可预测的。然而,如果需要确保线程按特定顺序执行,可以使用以下方法: 使用线程的join()方法:确保一个线…

【表单组件】地址组件新增精简模式

07/17 主要更新模块概览 快速筛选 精简模式 触发条件 自定义域名 01 表单管理 1.1 【表单组件】-数据关联组件新增快速筛选功能 说明: 数据关联组件新增快速筛选功能,用户在数据关联组件选择数据时,可以通过快速筛选功能&#xff0…

萝卜快跑突然就火了,背后发生了什么?

近日,百度旗下的自动驾驶出行平台“萝卜快跑”突然在网络上火了起来,成为热门话题。那么,这背后到底发生了什么? 1. 数字误传引发热议 首先,一些误传的数字在传播中起到了推波助澜的作用。例如,百度在2023…

Camtasia Studio2024最新版本新功能,并深入学习它的使用教程

在视频创作和教学内容制作领域,Camtasia Studio 一直是备受青睐的工具。随着 2024 版本的推出,Camtasia Studio 带来了更多强大的功能和优化,为用户提供了更高效、更便捷的创作体验。接下来,让我们详细了解一下 Camtasia Studio 2…

只需三步,即可使用 Kafka 托管服务快速部署微服务架构应用

微服务架构的应用程序的特点是将其组件组织得能够独立地进行开发、测试、部署和扩展。DigitalOcean App Platform(应用平台)的目标是通过允许用户在同一应用上添加多个组件,简化这一架构模型,使其更加平滑和易于管理。 一个简单的…

【BUG】已解决:TypeError: expected string or bytes-like object

TypeError: expected string or bytes-like object 目录 TypeError: expected string or bytes-like object 【常见模块错误】 【解决方案】 常见原因及解决方法 示例代码 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰…

【BUG】已解决:libpng warning: iccp: known incorrect sRGB profile

已解决:libpng warning: iccp: known incorrect sRGB profile 目录 已解决:libpng warning: iccp: known incorrect sRGB profile 【常见模块错误】 错误原因: 原因分析 解决方案 具体步骤 欢迎来到英杰社区https://bbs.csdn.net/topics…

Vue3 对比 Vue2

相关信息简介2020年9月18日,Vue.js发布3.0版本,代号:One Piece(海贼王) 2 年多开发, 100位贡献者, 2600次提交, 600次 PR、30个RFC Vue3 支持 vue2 的大多数特性 可以更好的支持 Typescript,提供了完整的…

QT5.9.9+Android开发环境搭建

文章目录 1.安装准备1.1 下载地址1.2 安装前准备2.安装过程2.1 JDK安装2.1.1 安装2.1.2 环境变量配置2.2 SDK配置2.2.1 安装2.2.2 环境变量配置2.2.3 adb 错误解决2.2.4 其他SDK安装2.2.5 AVD虚拟机配置2.3 NDK配置2.4 QT 5.9.9安装配置2.4.1 QT安装2.4.2 配置安卓环境3.QT工程…

特斯拉:领先未来的电动汽车先锋

特斯拉(Tesla)作为全球电动汽车行业的领军者,以其创新技术和前瞻愿景在全球范围内赢得了广泛的认可和喜爱。由亿万富翁埃隆马斯克(Elon Musk)于2003年创立,特斯拉不仅仅是一家汽车制造公司,更是…