C#中的MD5摘要算法与哈希算法
文章目录
- 一、哈希算法基础
- 二、MD5 算法原理
- 三、MD5摘要算法
- 四、哈希算法
- 五、C#实现示例
- MD5算法示例
- 哈希算法示例
- 字符串MD5值对比
- 六、总结
一、哈希算法基础
哈希算法是一种单向密码体制,它将任意长度的数据转换成固定长度的字符串。这种转换是不可逆的,即无法从哈希值恢复原始数据。哈希算法的主要特点包括:
- 确定性:相同的输入总是产生相同的输出。
- 快速计算:哈希函数的计算速度非常快。
- 抗篡改性:输入数据的微小变化会导致哈希值的显著变化。
- 雪崩效应:输出的每一位都与输入的每一位相关。
二、MD5 算法原理
MD5 算法将输入的数据分为多个512位的块,然后通过四个主要的步骤处理每个块:
- 初始化:设置四个32位的变量 A, B, C, D。
- 主循环:对每个512位的数据块进行16次迭代,每次迭代使用不同的函数和常数。
- 最终结果:将初始变量与迭代结果合并,得到最终的128位哈希值。
- 输出:将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值对比
步骤
- 计算第一个字符串的MD5值:使用MD5算法生成第一个字符串的哈希值。
- 计算第二个字符串的MD5值:同样使用MD5算法生成第二个字符串的哈希值。
- 比较两个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值对比 六、总结 一、哈希算法基础 哈希算法是一种单向密码体制,它将任意长度的数据转换成固定长度的字符串。这种转换是不可逆的࿰…...
使用 python 构建企业级高可用海量爬虫调度系统
一、引言 在大数据时代,信息的获取与分析成为了企业决策的重要依据。对于营销行业而言,实时抓取和分析竞争对手动态、市场趋势以及用户反馈等数据,是制定有效策略的关键。然而,构建一个高可用的、能够处理海量数据的爬虫调度系统…...
IDEA常用技巧荟萃:精通开发利器的艺术
1 概述 在现代软件开发的快节奏环境中,掌握一款高效且功能全面的集成开发环境(IDE)是提升个人和团队生产力的关键。IntelliJ IDEA,作为Java开发者的首选工具之一,不仅提供了丰富的编码辅助功能,还拥有高度…...
GD32F303之CAN通信
1、CAN时钟 GD32F303主时钟频率最大是120Mhz,然后APB1时钟最大是60Mhz,APB2时钟最大是120Mhz,CAN挂载在APB1总线上面 所以一般CAN的时钟频率是60Mhz,这个频率和后面配置波特率有关 2、GD32F303时钟配置 首先我们知道芯片有几个时钟 HXTAL:高速外部时钟࿱…...
postgres 的dblink使用,远程连接数据库
一.安装下载 dblink create extension if not exists dblink 查看是否已经安装 select * from pg_extension;二.运行,查询数据 其中,第一个参数是dblink名字,也可以是连接字符串。 第二个参数是要执行的SQL查询语句。AS子句用于指定返回结…...
短视频矩阵系统是什么?怎么搭建短视频矩阵系统?一文了解矩阵模式
在数字时代,短视频已成为信息传播的新宠,而短视频矩阵系统则是品牌和个人在短视频领域取得突破的重要工具。那么,短视频矩阵系统究竟是什么?如何搭建这样一个高效的系统?它又能够解决哪些问题呢?本文将为您…...
查看centos硬盘大小
直接上命令 lsblk...
2024 年 6 月公链行业研报:市场回调,比特币和以太坊 Layer 2 表现各异
作者:stellafootprint.network 数据来源:公链 Research 页面 六月,加密货币市场经历了显著的挑战。比特币因即将到来的 Mt. Gox 赔偿支付及政府清算的压力,导致市场不确定性加剧。尽管美国现货以太坊 ETF 的推进带来了积极信号…...
SAP S4 销售组的定义和分配
spro-企业结构-定义-销售与分销-维护销售组 新增一个记录 spro-企业结构-分配-销售与分销-给销售办公室分配销售组...
实时数仓和离线数仓的区别是什么,企业该如何选择合适的数仓架构?
目录 一、离线数仓 1. 离线数仓是什么? 2. 离线数仓的特点 3. 离线数仓的适用场景 二、实时数仓 1. 实时数仓是什么? 2. 实时数仓的特点 3. 实时数仓的适用场景 三、由数仓需求变化带来的数据仓库架构的演变 1. 传统数仓架构 2. 离线大数据架构 3. Lambd…...
花所Flower非小号排名20名下载花所Flower
1、Flower花所介绍 Flower花所是一家新兴的数字货币交易平台,致力于为全球用户提供安全、便捷的交易体验。平台以其强大的技术支持和丰富的交易产品闻名,为用户提供多样化的数字资产交易服务,涵盖了主流和新兴数字货币的交易需求。 2. Flowe…...
程序员有哪些职位?
互联网行业中的岗位种类繁多、五花八门,学习一门技术后,重要的是找到合适的职业发展方向,程序员有哪些职业发展方向?一起来看看吧! 1.架构师 架构师需要程序员有强大的技术实力和深厚的技术积累。建筑师的成长需要经…...
python+Selenium自动化之免登录(cookie及token)
目录 cookie免登录 通过接口获取cookie 启用浏览器绕过登录 添加token 使用登录可以减去每次登录的重复操作,直接操作系统登录后的菜单页面,也可以减少安全验证登录,如图像验证登录的操作。注意:cookie和token都有有效期。 c…...
Web安全:SQL注入
一、SQL注入三要素 1、用户可以对输入的参数值进行修改。 2、后端不对用户输入的参数值进行严格过滤。 3、用户修改后的参数值可以被带入后端中成功执行,并返回一定结果。 二、SQL注入原理 简单来说,用户输入的值会被插入到SQL语句中,然后…...
【LLM-驯化】成功配置多模态大模型InternLM-XComposer微调环境
【LLM-驯化】成功配置多模态大模型InternLM-XComposer微调环境 本次修炼方法请往下查看 🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地! 🎇 免费获取相关内容文档关注&am…...
C++·继承
面向对象编程有三大特性:封装、继承、多态。 封装我们前几节已经讲过了,第一层封装是将一个数据和方法都封装到一个类中,想让用户访问的定义成公有,不想让用户访问的定义成私有,第二层封装就类似于迭代器、适配器的思想…...
2024最适合小白的Midjourney教程,值得收藏!
一、Midjourney 的提示词 1、提示可以包括一个或多个图像 URL、多个文本短语以及一个或多个参数 1)Image Prompts(图像提示):可以将图像 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目标检测
摘要: 记录MindSpore AI框架使用SSD目标检测算法对图像内容识别的过程、步骤和方法。包括环境准备、下载数据集、数据采样、数据集加载和预处理、构建模型、损失函数、模型训练、模型评估等。 一、概念 1.模型简介 SSD目标检测算法 Single Shot MultiBox Detecto…...
vb.netcad二开自学笔记9:界面之ribbon
一个成熟的软件怎么能没有ribbon呢,在前面的框架基础上再加个命令AddRibbon <CommandMethod("AddRibbon")> Public Sub AddRibbon() Dim ribbonControl As RibbonControl ComponentManager.Ribbon Dim tab As RibbonTab New RibbonTab() tab.Tit…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
