当前位置: 首页 > 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…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...