当前位置: 首页 > article >正文

理解三种哈希算法:MD5、CRC、SHA256

0、背景

哈希算法是一类重要的算法,用于将任意长度的数据映射为固定长度的哈希值。哈希算法广泛应用于数据完整性校验、密码学、数字签名等领域。本文将详细介绍三种常见的哈希算法:MD5、CRC 和 SHA256,并探讨它们的原理、特点及应用场景。

1、MD5

MD5 是一种广泛使用的哈希算法,由 Ronald Rivest 于 1991 年设计。它将任意长度的输入数据转换为一个 128 位(16 字节)的哈希值。MD5 最初被设计用于数据完整性校验,但由于其安全性问题,现已不推荐用于密码学领域。MD5 的核心是一个基于 Merkle-Damgård 结构 的压缩函数。它将输入数据分块处理,每块 512 位(64 字节),并通过四轮非线性操作生成哈希值。

1.1、MD5的实现步骤

  • 填充:将输入数据填充至长度满足 (长度 % 512) = 448,并附加一个 64 位的长度字段。
  • 分块:将填充后的数据分为 512 位的块。
  • 初始化:设置 4 个 32 位的初始变量(A、B、C、D)。
  • 压缩:对每个块进行四轮非线性操作,更新变量 A、B、C、D。
  • 输出:将最终的 A、B、C、D 连接起来,形成 128 位的哈希值。

1.2、MD5特点及使用场景

MD5的主要特点如下:

  • 速度快:MD5 的计算速度较快,适合处理大量数据。
  • 哈希值短:128 位的哈希值长度较短,容易发生碰撞。
  • 安全性不足:MD5 已被证明存在严重的碰撞漏洞,不适合用于密码学领域。
    MD5的主要应用场景如下:
  • 数据完整性校验:用于校验文件是否被篡改。

1.3、使用示例

#include <openssl/md5.h>
#include <stdio.h>void compute_md5(const char* str) {unsigned char result[MD5_DIGEST_LENGTH];MD5((unsigned char*)str, strlen(str), result);printf("MD5: ");for (int i = 0; i < MD5_DIGEST_LENGTH; i++) {printf("%02x", result[i]);}printf("\n");
}int main() {compute_md5("hello world");return 0;
}

2、CRC

CRC 是一种基于多项式除法的校验算法,用于检测数据传输或存储过程中的错误。CRC 不是严格意义上的哈希算法,但它生成的校验值可以看作是一种哈希值。CRC 的核心思想是将数据视为一个二进制多项式,通过模 2 除法计算余数,并将余数作为校验值。

2.1、CRC实现步骤

  • 选择生成多项式:例如,CRC-32 使用多项式 0x04C11DB7。
  • 初始化:设置一个初始值(通常为全 1 或全 0)。
  • 逐位计算:对输入数据的每一位进行模 2 除法,更新余数。
  • 输出:将最终的余数作为校验值。

2.2、CRC特点及使用场景

CRC特点如下:

  • 速度快:CRC 的计算速度非常快,适合实时校验。
  • 校验值短:CRC 的校验值通常为 16 位、32 位或 64 位。
  • 仅用于错误检测:CRC 不能用于密码学领域,仅用于检测随机错误。
    CRC应用场景如下:
  • 网络通信:用于检测数据包传输中的错误。
  • 存储系统:用于校验磁盘或内存中的数据完整性。

2.3、使用示例

#include <iostream>
#include <boost/crc.hpp>void compute_crc32(const std::string& data) {boost::crc_32_type crc;crc.process_bytes(data.data(), data.size());std::cout << "CRC32: " << std::hex << crc.checksum() << std::endl;
}int main() {compute_crc32("hello world");return 0;
}

3、SHA256

SHA256 是 SHA-2 系列哈希算法的一种,由美国国家安全局(NSA)设计。它将任意长度的输入数据转换为一个 256 位(32 字节)的哈希值。SHA256 是目前广泛使用的密码学哈希算法之一。SHA256 的核心是一个基于 Merkle-Damgård 结构 的压缩函数。它将输入数据分块处理,每块 512 位(64 字节),并通过 64 轮非线性操作生成哈希值。

3.1、SHA256实现步骤

  • 填充:将输入数据填充至长度满足 (长度 % 512) = 448,并附加一个 64 位的长度字段。
  • 分块:将填充后的数据分为 512 位的块。
  • 初始化:设置 8 个 32 位的初始变量(A、B、C、D、E、F、G、H)。
  • 压缩:对每个块进行 64 轮非线性操作,更新变量 A、B、C、D、E、F、G、H。
  • 输出:将最终的 A、B、C、D、E、F、G、H 连接起来,形成 256 位的哈希值。

3.2、SHA256特点及使用场景

SHA256使用特点如下:

  • 安全性高:SHA256 具有较高的抗碰撞能力,适合用于密码学领域。
  • 哈希值长:256 位的哈希值长度较长,碰撞概率极低。
  • 计算速度较慢:SHA256 的计算速度比 MD5 和 CRC 慢,但仍在可接受范围内。
    SHA256应用场景如下:
  • 数字签名:用于生成和验证数字签名。
  • 区块链:比特币等区块链系统使用 SHA256 计算区块哈希。
  • 密码存储:用于安全地存储用户密码。

3.3、使用示例

#include <openssl/sha.h>
#include <stdio.h>void compute_sha256(const char* str) {unsigned char result[SHA256_DIGEST_LENGTH];SHA256((unsigned char*)str, strlen(str), result);printf("SHA-256: ");for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {printf("%02x", result[i]);}printf("\n");
}int main() {compute_sha256("hello world");return 0;
}

4、3种算法对比

特性MD5CRCSHA256
哈希值长度128 位16/32/64 位256 位
安全性低(已被破解)仅用于错误检测
计算速度非常快较慢
应用场景数据完整性校验、旧版密码存储网络通信、存储系统错误检测数字签名、区块链、密码存储

相关文章:

理解三种哈希算法:MD5、CRC、SHA256

0、背景 哈希算法是一类重要的算法&#xff0c;用于将任意长度的数据映射为固定长度的哈希值。哈希算法广泛应用于数据完整性校验、密码学、数字签名等领域。本文将详细介绍三种常见的哈希算法&#xff1a;MD5、CRC 和 SHA256&#xff0c;并探讨它们的原理、特点及应用场景。 …...

机器学习基本篇

文章目录 1 基本概念2 基本流程2.0 数据获取2.1 预处理2.1.0 认识数据认识问题2.1.1 不平衡标签的处理a.随机过采样方法 ROS,random over-samplingb. SMOTE synthetic minority Over-Sampling Technique2.2 缺失值处理2.3 数据清洗2.3.0离散特征编码2.3.1 连续特征处理归一化标…...

#渗透测试#批量漏洞挖掘#Apache Log4j反序列化命令执行漏洞

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 Apache Log4j反序列化命令执行漏洞 一、…...

python常用库整理

Python常用库众多&#xff0c;涵盖了数据分析、科学计算、机器学习、Web开发、游戏开发、自然语言处理、图像处理、自动化测试等多个领域。以下是一些常用的Python库及其主要用途&#xff1a; 数据分析与科学计算 NumPy&#xff1a;用于科学计算的基础库&#xff0c;支持大型…...

SQL数据处理函数全解析

1. 引言 1.1 SQL简介 SQL(Structured Query Language)是用于管理和操作关系型数据库的标准语言。它允许用户查询、插入、更新和删除数据库中的数据。SQL的强大之处在于其内置的函数库,这些函数可以帮助我们更高效地处理数据。 1.2 数据处理函数的重要性 数据处理函数在S…...

Python解决“反应物浓度”问题

Python解决“反应物浓度”问题 问题描述测试样例解题思路代码 问题描述 在一个神秘的实验室里&#xff0c;科学家小Z正在研究一种特殊的化学反应。她有一个名为 reactant 的初始物质&#xff0c;其起始值为 0。为了推动实验进展&#xff0c;小Z设计了一系列操作&#xff0c;这…...

HTTP FTP SMTP TELNET 应用协议

1. 标准和非标准的应用协议 标准应用协议&#xff1a; 由标准化组织&#xff08;如 IETF&#xff0c;Internet Engineering Task Force&#xff09;制定和维护&#xff0c;具有广泛的通用性和互操作性。这些协议遵循严格的规范和标准&#xff0c;不同的实现之间可以很好地进行…...

百度搜索全面接入DeepSeek-R1满血版:AI与搜索的全新融合

不等了&#xff0c;就是现在&#xff01;百度搜索全量接入DeepSeek-R1满血版 百度搜索已正式全量接入DeepSeek-R1满血版&#xff0c;在宣布“将接入”仅过了24小时后。 就在宣布“将接入”仅24小时后&#xff0c;百度搜索 已正式全量接入 DeepSeek-R1满血版&#xff01;得益于…...

《DeepSeek技术:开启工业互联网低成本开发新时代》

在工业互联网蓬勃发展的当下&#xff0c;企业数字化转型的需求日益迫切。然而&#xff0c;高昂的应用开发成本却如同拦路虎&#xff0c;阻碍着众多企业的前进步伐。此时&#xff0c;DeepSeek技术的出现&#xff0c;为工业互联网应用开发带来了新曙光&#xff0c;凭借其独特优势…...

深入浅出TypedArray:网络数据处理、WebGPU与加密实战

JavaScript的TypedArray是现代Web开发中处理二进制数据的利器。本文将结合网络数据传输、WebGPU编程和简单加密算法三个实战场景&#xff0c;带你领略TypedArray的强大能力。 一、TypedArray基础认知 TypedArray家族包括Int8Array、Uint16Array、Float32Array等11种视图类型&a…...

nordic(nrf52832、nrf52840)如何使用SES(SEGGER Embedded Studio)编辑编译工程?

nordic官方例程中一般都会给出好几个不同的编译环境供用户选择&#xff0c;一般是 keil工程、armgcc工程、IAR工程、ses工程等。 一、segger embedded studio如何添加工程.h头文件&#xff1f; 1)首先打开options 2&#xff09;下拉选中common 3&#xff09;找到common下的Pre…...

LabVIEW利用CANopen的Batch SDO写入

本示例展示了如何通过CANopen协议向设备写入Batch SDO&#xff08;批量服务数据对象&#xff09;。Batch SDO允许用户在一次操作中配置多个参数&#xff0c;适用于设备的批量配置和参数设置。此方法能够简化多个参数的写入过程&#xff0c;提高设备管理效率。 主要步骤&#xf…...

P11071 「QMSOI R1」 Distorted Fate Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​)&#xff0c;有 m m m 个操作分两种&#xff1a; modify ⁡ ( l , r , x ) \operatorname{modify}(l,r,x) modify(l,r,x)&#xff1a;对每个 i ∈ [ l , r ] i \in [l,r] i∈…...

WebSocket在分布式环境中的局限性及解决方案

WebSocket 在分布式环境中存在一些局限性&#xff0c;特别是当系统需要扩展多个服务实例时&#xff0c;单个 WebSocket 连接的管理和消息推送就变得比较复杂。因此&#xff0c;必须采取一些额外的措施来确保 WebSocket 能在多个服务实例之间正确工作。 WebSocket 在分布式环境…...

Flutter 跳转后不允许返回

如果在 Flutter 中使用 Navigator.pushNamed(context, /)&#xff0c;默认情况下它会将新的页面压入栈中&#xff0c;这样用户可以按返回键返回上一页。但如果你不想让用户返回&#xff0c;而是直接跳转到 / 并清除导航栈&#xff0c;可以使用 pushReplacementNamed 或 pushNam…...

spconv 安装测试

pip install spconv 报错: File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/module.py", line 1736, in _wrapped_call_impl return self._call_impl(*args, **kwargs) File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/mod…...

关于es6-module的语法

ES6&#xff08;ECMAScript 2015&#xff09;引入了模块化的概念&#xff0c;旨在使 JavaScript 更加模块化、可维护和可重用。ES6 模块允许我们在不同的文件中组织和管理代码&#xff0c;使得不同模块之间的依赖关系更加清晰。 1. 导出&#xff08;Export&#xff09; 1.1 命…...

python旅游推荐系统+爬虫+可视化(协同过滤算法)

✅️基于用户的协同过滤算法 ✅️有后台管理 ✅️2w多数据集 这个旅游数据分析推荐系统采用了Python语言、Django框架、MySQL数据库、requests库进行网络爬虫开发、机器学习中的协同过滤算法、ECharts数据可视化技术&#xff0c;以实现从网站抓取旅游数据、个性化推荐和直观展…...

【弹性计算】IaaS 和 PaaS 类计算产品

《弹性计算产品》系列&#xff0c;共包含以下文章&#xff1a; 云服务器&#xff1a;实例、存储、网络、镜像、快照容器、裸金属云上运维IaaS 和 PaaS 类计算产品 &#x1f60a; 如果您觉得这篇文章有用 ✔️ 的话&#xff0c;请给博主一个一键三连 &#x1f680;&#x1f680…...

视频转序列帧

视频转序列帧 介绍操作总结 介绍 这篇文章不是单独讲视频转序列帧所有的方法&#xff0c;这里是针对我后面要做序列帧动画优化的一个工具篇幅。这里我用的premiere Pro 2020下面会讲方法简称pr。 操作 打开pr点击新建项目 输入名称点击确认 将需要转换的视频导入到媒体浏览…...

大模型应用怎么学习,在哪里实现开发:Dify、AnyThingLLM、LangFlow

大模型应用怎么学习,在哪里实现开发 目录 大模型应用怎么学习,在哪里实现开发Dify、AnyThingLLM、LangFlow的官网地址及使用方法DifyAnyThingLLMLangFlowDify、AnyThingLLM、LangFlow是什么怎么使用DifyAnyThingLLMLangFlowDify、AnyThingLLM、LangFlow名字的含义Dify、AnyTh…...

LLM有哪些可控超参数

LLM有哪些可控超参数 目录 LLM有哪些可控超参数生成控制类采样相关类推理优化类惩罚类其他类计算资源与批量处理类上下文与Token相关类内存相关类生成控制类 以流式返回对话响应:指模型在生成回复时,是否以逐字或逐句的流式方式返回给用户,而不是等全部生成完再返回,能提升…...

C++共享指针实战

需求&#xff1a; 有三个类&#xff0c;分别是A,B, R。在B类里new 了一个R的智能指针&#xff0c; 这个R的生命周期和B相同。同时A类也存了一个B中存放关于R的智能指针。B销毁同时A指向R的指针也失效&#xff0c;并调用R的析构函数&#xff0c;如何实现 #include <iostream…...

算法分析—— 《归并排序》

《排序数组》 题目描述&#xff1a; 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题&#xff0c;时间复杂度为 O(nlog(n))&#xff0c;并且空间复杂度尽可能小。 示例 1&#xff1a; 输入&#xff1a;nums [5,2…...

SpringBoot启动时报错:cannot use an unresolved DNS server address: I:53

报错如下&#xff1a; 2025-02-17 13:59:41.374 [main] ERROR org.springframework.boot.SpringApplication:835 - Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name mySwaggerResourceProvider def…...

AI进展不止于基准:深度解析Grok 3的局限

基准测试长期以来一直是AI评估的基石,但任何认真的AI科学家都知道它们是可以被“游戏化”的。 我曾经详细写过这个问题,甚至LMsys也不得不调整其盲测格式——将Grok 3用不同的标签代替,而不仅仅是隐藏品牌——以减少品牌偏见。 高能力AI,尤其是像GPT-4级别的模型,或那些依…...

物联网技术赋能预测性维护的深度剖析与前景展望

一、引言 1.1 研究背景与意义 随着信息技术的飞速发展,物联网技术已逐渐渗透到各个行业领域,成为推动产业变革和创新的重要力量。物联网通过将各种设备、物品与互联网连接,实现数据的采集、传输和交互,为各行业带来了前所未有的智能化和自动化水平提升。在工业领域,设备…...

Python变量作用域250218

函数调用时&#xff0c;会创建自己的独有的作用域作用域是以函数为作用域的而且使用条件语句&#xff0c;可能让定义一些变量的代码运行&#xff0c;从而创建其内部变量&#xff0c;如果定义条件不成立&#xff0c;这些变量就不会被创建并被使用变量只要在函数中出现&#xff0…...

SQL Server 运算符优先级

在 SQL Server 中&#xff0c;运算符的优先级决定了在没有使用括号明确指定计算顺序时&#xff0c;运算符的执行顺序。 运算符优先级列表 括号 () 一元运算符 &#xff08;正号&#xff09;-&#xff08;负号&#xff09;~&#xff08;按位取反&#xff09; 乘法、除法和取模…...

Miniconda + VSCode 的Python环境搭建

目录&#xff1a; 安装 VScode 安装 miniconda 在VScode 使用conda虚拟环境 运行Python程序 1.安装 vscode 编辑器 官网链接&#xff1a;Visual Studio Code - Code Editing. Redefined 下载得到&#xff1a;&#xff0c;双击安装。 安装成功…...