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

C#中的MD5摘要算法与哈希算法

文章目录

  • 一、哈希算法基础
  • 二、MD5 算法原理
  • 三、MD5摘要算法
  • 四、哈希算法
  • 五、C#实现示例
    • MD5算法示例
    • 哈希算法示例
    • 字符串MD5值对比
  • 六、总结

在这里插入图片描述


一、哈希算法基础

哈希算法是一种单向密码体制,它将任意长度的数据转换成固定长度的字符串。这种转换是不可逆的,即无法从哈希值恢复原始数据。哈希算法的主要特点包括:

  • 确定性:相同的输入总是产生相同的输出。
  • 快速计算:哈希函数的计算速度非常快。
  • 抗篡改性:输入数据的微小变化会导致哈希值的显著变化。
  • 雪崩效应:输出的每一位都与输入的每一位相关。

二、MD5 算法原理

MD5 算法将输入的数据分为多个512位的块,然后通过四个主要的步骤处理每个块:

  1. 初始化:设置四个32位的变量 A, B, C, D。
  2. 主循环:对每个512位的数据块进行16次迭代,每次迭代使用不同的函数和常数。
  3. 最终结果:将初始变量与迭代结果合并,得到最终的128位哈希值。
  4. 输出:将128位的哈希值转换成32位的十六进制字符串。

三、MD5摘要算法

MD5(Message Digest Algorithm 5)是一种广泛使用的密码散列函数,可以产生一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5算法于1991年由Ronald Rivest设计,是被广泛使用的摘要算法之一。

MD5算法将输入的消息(任意长)转换成一个固定长度的散列值。在转换过程中,算法会使用一系列的加密操作,如循环移位和异或运算,以生成最终的散列值。

然而,MD5算法已经不再被认为是安全的,因为它容易受到碰撞攻击,即可以找到两个不同的输入消息产生相同的散列值。因此,在安全性要求较高的场合,应避免使用MD5算法。

四、哈希算法

哈希算法是一种将输入(或者’键’)转换为固定长度字符串的函数,这个过程称为哈希。哈希算法在计算机科学中有着广泛的应用,如数据结构中的哈希表,以及数字签名等领域。

与MD5算法相比,哈希算法更加强大和安全。哈希算法的设计目标是确保输入信息的任何微小变化都会导致输出结果(散列值)的巨大变化,从而提高安全性。

在C#中,我们可以使用System.Security.Cryptography命名空间下的MD5Cng类来实现MD5算法的功能。而对于哈希算法,我们可以使用HashAlgorithm抽象类及其派生类来实现。

五、C#实现示例

下面我们给出C#中MD5算法和哈希算法的实现示例。

MD5算法示例

using System;
using System.Security.Cryptography;
using System.Text;namespace Md5AndHashExample
{class Program{static void Main(string[] args){string input = "Hello, World!";string md5Result = GetMd5Hash(input);Console.WriteLine($"MD5 Hash: {md5Result}");}static string GetMd5Hash(string input){using (MD5Cng md5 = MD5Cng.Create()){byte[] inputBytes = Encoding.ASCII.GetBytes(input);byte[] hashBytes = md5.ComputeHash(inputBytes);StringBuilder sb = new StringBuilder();for (int i = 0; i < hashBytes.Length; i++){sb.Append(hashBytes[i].ToString("X2"));}return sb.ToString();}}}
}

哈希算法示例

using System;
using System.Security.Cryptography;
using System.Text;namespace Md5AndHashExample
{class Program{static void Main(string[] args){string input = "Hello, World!";string hashResult = GetHash(input, "SHA256");Console.WriteLine($"Hash: {hashResult}");}static string GetHash(string input, string algorithm){HashAlgorithm hashAlgorithm = GetHashAlgorithm(algorithm);byte[] inputBytes = Encoding.ASCII.GetBytes(input);byte[] hashBytes = hashAlgorithm.ComputeHash(inputBytes);StringBuilder sb = new StringBuilder();for (int i = 0; i < hashBytes.Length; i++){sb.Append(hashBytes[i].ToString("X2"));}return sb.ToString();}static HashAlgorithm GetHashAlgorithm(string algorithm){switch (algorithm.ToUpper()){case "SHA256":return SHA256.Create();case "SHA384":return SHA384.Create();case "SHA512":return SHA512.Create();default:throw new ArgumentException($"Unsupported hash algorithm: {algorithm}");}}}
}

字符串MD5值对比

步骤

  1. 计算第一个字符串的MD5值:使用MD5算法生成第一个字符串的哈希值。
  2. 计算第二个字符串的MD5值:同样使用MD5算法生成第二个字符串的哈希值。
  3. 比较两个MD5值:将两个哈希值进行比较,如果相同,则认为两个字符串相等。

示例代码

using System;
using System.Security.Cryptography;
using System.Text;public class MD5ComparisonExample
{// 计算字符串的MD5哈希值public static string ComputeMD5Hash(string input){using (MD5 md5 = MD5.Create()){byte[] inputBytes = Encoding.UTF8.GetBytes(input);byte[] hashBytes = md5.ComputeHash(inputBytes);// 将哈希字节数组转换为十六进制字符串StringBuilder sb = new StringBuilder();for (int i = 0; i < hashBytes.Length; i++){sb.Append(hashBytes[i].ToString("X2"));}return sb.ToString();}}// 比较两个字符串的MD5哈希值public static bool CompareMD5Hashes(string hash1, string hash2){return hash1.Equals(hash2, StringComparison.OrdinalIgnoreCase);}public static void Main(){string originalString1 = "Hello, World!";string originalString2 = "Different text.";string md5Hash1 = ComputeMD5Hash(originalString1);string md5Hash2 = ComputeMD5Hash(originalString2);Console.WriteLine($"MD5 Hash of '{originalString1}': {md5Hash1}");Console.WriteLine($"MD5 Hash of '{originalString2}': {md5Hash2}");// 比较两个字符串的MD5值bool areHashesEqual = CompareMD5Hashes(md5Hash1, md5Hash2);Console.WriteLine($"The MD5 hashes are equal: {areHashesEqual}");}
}

六、总结

本文介绍了MD5摘要算法和哈希算法的基本概念,并给出了C#语言的实现示例。通过这些示例,我们可以看到如何使用C#来计算字符串的MD5散列值和不同哈希算法的散列值。需要注意的是,MD5算法已经不再安全,不推荐用于安全性要求较高的场合。在实际应用中,应选择更为安全的哈希算法,如SHA256、SHA384或SHA512。

相关文章:

C#中的MD5摘要算法与哈希算法

文章目录 一、哈希算法基础二、MD5 算法原理三、MD5摘要算法四、哈希算法五、C#实现示例MD5算法示例哈希算法示例字符串MD5值对比 六、总结 一、哈希算法基础 哈希算法是一种单向密码体制&#xff0c;它将任意长度的数据转换成固定长度的字符串。这种转换是不可逆的&#xff0…...

使用 python 构建企业级高可用海量爬虫调度系统

一、引言 在大数据时代&#xff0c;信息的获取与分析成为了企业决策的重要依据。对于营销行业而言&#xff0c;实时抓取和分析竞争对手动态、市场趋势以及用户反馈等数据&#xff0c;是制定有效策略的关键。然而&#xff0c;构建一个高可用的、能够处理海量数据的爬虫调度系统…...

IDEA常用技巧荟萃:精通开发利器的艺术

1 概述 在现代软件开发的快节奏环境中&#xff0c;掌握一款高效且功能全面的集成开发环境&#xff08;IDE&#xff09;是提升个人和团队生产力的关键。IntelliJ IDEA&#xff0c;作为Java开发者的首选工具之一&#xff0c;不仅提供了丰富的编码辅助功能&#xff0c;还拥有高度…...

GD32F303之CAN通信

1、CAN时钟 GD32F303主时钟频率最大是120Mhz,然后APB1时钟最大是60Mhz,APB2时钟最大是120Mhz,CAN挂载在APB1总线上面 所以一般CAN的时钟频率是60Mhz,这个频率和后面配置波特率有关 2、GD32F303时钟配置 首先我们知道芯片有几个时钟 HXTAL&#xff1a;高速外部时钟&#xff1…...

postgres 的dblink使用,远程连接数据库

一.安装下载 dblink create extension if not exists dblink 查看是否已经安装 select * from pg_extension;二.运行&#xff0c;查询数据 其中&#xff0c;第一个参数是dblink名字&#xff0c;也可以是连接字符串。 第二个参数是要执行的SQL查询语句。AS子句用于指定返回结…...

短视频矩阵系统是什么?怎么搭建短视频矩阵系统?一文了解矩阵模式

在数字时代&#xff0c;短视频已成为信息传播的新宠&#xff0c;而短视频矩阵系统则是品牌和个人在短视频领域取得突破的重要工具。那么&#xff0c;短视频矩阵系统究竟是什么&#xff1f;如何搭建这样一个高效的系统&#xff1f;它又能够解决哪些问题呢&#xff1f;本文将为您…...

查看centos硬盘大小

直接上命令 lsblk...

2024 年 6 月公链行业研报:市场回调,比特币和以太坊 Layer 2 表现各异

作者&#xff1a;stellafootprint.network 数据来源&#xff1a;公链 Research 页面 六月&#xff0c;加密货币市场经历了显著的挑战。比特币因即将到来的 Mt. Gox 赔偿支付及政府清算的压力&#xff0c;导致市场不确定性加剧。尽管美国现货以太坊 ETF 的推进带来了积极信号…...

SAP S4 销售组的定义和分配

spro-企业结构-定义-销售与分销-维护销售组 新增一个记录 spro-企业结构-分配-销售与分销-给销售办公室分配销售组...

实时数仓和离线数仓的区别是什么,企业该如何选择合适的数仓架构?

目录 一、离线数仓 1. 离线数仓是什么&#xff1f; 2. 离线数仓的特点 3. 离线数仓的适用场景 二、实时数仓 1. 实时数仓是什么&#xff1f; 2. 实时数仓的特点 3. 实时数仓的适用场景 三、由数仓需求变化带来的数据仓库架构的演变 1. 传统数仓架构 2. 离线大数据架构 3. Lambd…...

花所Flower非小号排名20名下载花所Flower

1、Flower花所介绍 Flower花所是一家新兴的数字货币交易平台&#xff0c;致力于为全球用户提供安全、便捷的交易体验。平台以其强大的技术支持和丰富的交易产品闻名&#xff0c;为用户提供多样化的数字资产交易服务&#xff0c;涵盖了主流和新兴数字货币的交易需求。 2. Flowe…...

程序员有哪些职位?

互联网行业中的岗位种类繁多、五花八门&#xff0c;学习一门技术后&#xff0c;重要的是找到合适的职业发展方向&#xff0c;程序员有哪些职业发展方向&#xff1f;一起来看看吧&#xff01; 1.架构师 架构师需要程序员有强大的技术实力和深厚的技术积累。建筑师的成长需要经…...

python+Selenium自动化之免登录(cookie及token)

目录 cookie免登录 通过接口获取cookie 启用浏览器绕过登录 添加token 使用登录可以减去每次登录的重复操作&#xff0c;直接操作系统登录后的菜单页面&#xff0c;也可以减少安全验证登录&#xff0c;如图像验证登录的操作。注意&#xff1a;cookie和token都有有效期。 c…...

Web安全:SQL注入

一、SQL注入三要素 1、用户可以对输入的参数值进行修改。 2、后端不对用户输入的参数值进行严格过滤。 3、用户修改后的参数值可以被带入后端中成功执行&#xff0c;并返回一定结果。 二、SQL注入原理 简单来说&#xff0c;用户输入的值会被插入到SQL语句中&#xff0c;然后…...

【LLM-驯化】成功配置多模态大模型InternLM-XComposer微调环境

【LLM-驯化】成功配置多模态大模型InternLM-XComposer微调环境 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档关注&am…...

C++·继承

面向对象编程有三大特性&#xff1a;封装、继承、多态。 封装我们前几节已经讲过了&#xff0c;第一层封装是将一个数据和方法都封装到一个类中&#xff0c;想让用户访问的定义成公有&#xff0c;不想让用户访问的定义成私有&#xff0c;第二层封装就类似于迭代器、适配器的思想…...

2024最适合小白的Midjourney教程,值得收藏!

一、Midjourney 的提示词 1、提示可以包括一个或多个图像 URL、多个文本短语以及一个或多个参数 1&#xff09;Image Prompts&#xff08;图像提示&#xff09;&#xff1a;可以将图像 URL 添加到提示中以影响最终结果的样式和内容。图像 URL 始终出现在提示的前面。文件应以.…...

MVC 返回集合方法,以及分页

返回一个数据集方法 返回多个数据集方法 》》定义一个Model public class IndexMoel {public List<UserGroup> UserGroup{get;set;}public List<User> User{get;set;}}》》》控制器 //db 是 EF 中的上下文 var listnew IndexModel(); list.UserGroupdb.UserGro…...

昇思MindSpore学习笔记6-05计算机视觉--SSD目标检测

摘要&#xff1a; 记录MindSpore AI框架使用SSD目标检测算法对图像内容识别的过程、步骤和方法。包括环境准备、下载数据集、数据采样、数据集加载和预处理、构建模型、损失函数、模型训练、模型评估等。 一、概念 1.模型简介 SSD目标检测算法 Single Shot MultiBox Detecto…...

vb.netcad二开自学笔记9:界面之ribbon

一个成熟的软件怎么能没有ribbon呢&#xff0c;在前面的框架基础上再加个命令AddRibbon <CommandMethod("AddRibbon")> Public Sub AddRibbon() Dim ribbonControl As RibbonControl ComponentManager.Ribbon Dim tab As RibbonTab New RibbonTab() tab.Tit…...

学习笔记——动态路由——OSPF链路状态通告(LSA)

十、OSPF链路状态通告(LSA) 1、链路状态通告简介 (1)LAS概述 链路状态通告(Link State Advertisement&#xff0c;LSA)是路由器之间链路状态信息的载体。LSA是LSDB的最小组成单位&#xff0c;LSDB由一条条LSA构成的。是OSPF中计算路由的重要依据。 LSA用于向其它邻接OSPF路…...

模拟防止重复提交

gitee地址&#xff08;需要自取&#xff09;AopProxy重复提交: 防止重复提交 (gitee.com) RestController public class SubmissionController {Autowiredprivate SubmissionService submissionService;private static Jedis jedis new Jedis("localhost",6379);pr…...

C++:strcut与class的区别

在C中&#xff0c;struct和class在语法上非常相似&#xff0c;但它们之间确实存在一些关键的差异&#xff0c;这些差异主要体现在成员的默认访问权限和继承的默认方式上。然而&#xff0c;从更广泛的角度来看&#xff0c;它们都可以用来定义自定义数据类型&#xff0c;包含数据…...

科研绘图系列:R语言两组数据散点分布图(scatter plot)

介绍 展示两组数据的散点分布图是一种图形化表示方法,用于显示两个变量之间的关系。在散点图中,每个点代表一个数据点,其x坐标对应于第一组数据的值,y坐标对应于第二组数据的值。以下是散点图可以展示的一些结果: 线性关系:如果两组数据之间存在线性关系,散点图将显示出…...

【EasyExcel】根据单元格内容自动调整列宽

1.自定义Excel列宽样式策略类 import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.metadata.data.WriteCellData; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import com.alibaba.e…...

半月内笔者暂不写时评文

今晨&#xff0c;笔者在刚恢复的《新浪微博》发布消息表态如下&#xff1a;“要开会了&#xff01;今起&#xff0c;半月内笔者暂不写敏感时评文&#xff0c;不让自媒体网管感到压力&#xff0c;也是张驰有度、识时务者为俊杰之正常选择。野钓去也。” 截图&#xff1a;来源笔者…...

Python面试题:如何在 Python 中解析 XML 文件?

在 Python 中解析 XML 文件可以使用内置的 xml.etree.ElementTree 模块。以下是一个示例&#xff0c;展示了如何使用这个模块解析 XML 文件&#xff1a; 读取 XML 文件&#xff1a; import xml.etree.ElementTree as ET# 读取 XML 文件 tree ET.parse(example.xml) root tr…...

3033.修改矩阵

1.题目描述 给你一个下标从 0 开始、大小为 m x n 的整数矩阵 matrix &#xff0c;新建一个下标从 0 开始、名为 answer 的矩阵。使 answer 与 matrix 相等&#xff0c;接着将其中每个值为 -1 的元素替换为所在列的 最大 元素。 返回矩阵 answer 。 示例 1&#xff1a; 输入&am…...

解决MCM功率电源模块EMC的关键

对MCM功率电源而言&#xff0c;由于其工作在几百kHz的高频开关状态&#xff0c;故易成为干扰源。电磁兼容性EMC&#xff08;Electro Magnetic Compatibility&#xff09;&#xff0c;是指设备或系统在其电磁环境中符合要求运行并不对其环境中的任何设备产生无法忍受的电磁干扰的…...

在conda的环境中安装Jupyter及其他软件包

Pytorch版本、安装和检验 大多数软件包都是随Anaconda安装的&#xff0c;也可以根据需要手动安装一些其他软件包。 目录 创建虚拟环境 进入虚拟环境 安装Jupyter notebook 安装matplotlib 安装 pandas 创建虚拟环境 基于conda包的环境创建、激活、管理与删除http://t.cs…...