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。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43574.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43574.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43574.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IDEA中配置代理,解決Codearts Snap登陸不了的問題

問題描述&#xff1a;在mac電腦中的idea中安裝了華為的codearts snap插件&#xff0c;一直登錄不了&#xff0c;賬號是沒問題的&#xff0c;后來我懷疑是我的代理有問題&#xff0c;找到IDEA中的代理設置先是有這個問題“You have JVM property "https.proxyHost" se…

千呼新零售2.0分銷商城視頻介紹

千呼新零售2.0系統是零售行業連鎖店一體化收銀系統&#xff0c;包括線下收銀線上商城連鎖店管理ERP管理商品管理供應商管理會員營銷等功能為一體&#xff0c;線上線下數據全部打通。 適用于商超、便利店、水果、生鮮、母嬰、服裝、零食、百貨、寵物等連鎖店使用。 詳細介紹請…

C語言 將兩個字符串連接起來,不用strcat函數

編一個程序,將兩個字符串連接起來,不要用strcat函數。 #include <stdio.h>void my_strcat(char *s1, const char *s2) {while (*s1) {s1;}while (*s2) {*s1 *s2;s1;s2;}*s1 \0; }int main() {char s1[100] "Hello, ";char s2[] "World!";my_str…

Android初學者書籍推薦

書單 1.《Android應用開發項目式教程》&#xff0c;機械工業出版社&#xff0c;2024年出版2.《第一行代碼Android》第二版3.《第一行代碼Android》第三版4.《瘋狂Android講義》第四版5.《Android移動應用基礎教程&#xff08;Android Studio 第2版&#xff09;》 從學安卓到用安…

uniapp 打包成安卓APP預覽base64pdf實現方法

下載PDF.js 問題描述 在uniapp中預覽base64的PDF&#xff0c;可以使用web-view組件嵌入一個PDF.js的實例。以下是一個簡單的示例&#xff1a; 解決方案&#xff1a; 1.在頁面的.vue文件中添加web-view組件&#xff1a; <template><view style"width: 50%;&qu…

【機器學習】支持向量機與主成分分析在機器學習中的應用

文章目錄 一、支持向量機概述什么是支持向量機&#xff1f;超平面和支持向量大邊距直覺 二、數據預處理與可視化數據集的基本信息導入必要的庫加載數據集數據概況數據可視化特征對的散點圖矩陣類別分布條形圖平均面積與平均光滑度的散點圖變量之間的相關性熱圖 三、模型訓練&am…

JS【詳解】類 class ( ES6 新增語法 )

本質上&#xff0c;類只是一種特殊的函數。 console.log(typeof 某類); //"function"聲明類 class 方式 1 – 類聲明 class Car {constructor(model, year) {this.model model;this.year year;} }方式 2 – 類表達式 匿名式 const Car class {constructor(mod…

在conda的環境中安裝Jupyter及其他軟件包

Pytorch版本、安裝和檢驗 大多數軟件包都是隨Anaconda安裝的&#xff0c;也可以根據需要手動安裝一些其他軟件包。 目錄 創建虛擬環境 進入虛擬環境 安裝Jupyter notebook 安裝matplotlib 安裝 pandas 創建虛擬環境 基于conda包的環境創建、激活、管理與刪除http://t.cs…

podman 替代 docker ? centos Stream 10 已經棄用docker,開始用podman了!

&#x1f468;?&#x1f393;博主簡介 &#x1f3c5;CSDN博客專家 ??&#x1f3c5;云計算領域優質創作者 ??&#x1f3c5;華為云開發者社區專家博主 ??&#x1f3c5;阿里云開發者社區專家博主 &#x1f48a;交流社區&#xff1a;運維交流社區 歡迎大家的加入&#xff01…

淺談React

forwardRef和useImperativeHandle的聯動使用 import React, { useImperativeHandle, useRef } from "react" import { forwardRef } from "react"const CustomInput forwardRef((props, ref) > {const inputRef useRef<HTMLInputElement>(null…

Java中鎖的分類、原理、使用場景、注意事項、優缺點等詳解

Java開發中&#xff0c;鎖是保證多線程安全的重要手段。Java提供了多種類型的鎖來滿足不同的同步需求。在這篇文章中&#xff0c;我將為您介紹以下幾種常見的鎖類型&#xff1a; 偏向鎖/輕量級鎖/重量級鎖 偏向鎖&#xff1a;當一個線程獲取一個對象的鎖時&#xff0c;如果發現…

解決MCM功率電源模塊EMC的關鍵

對MCM功率電源而言&#xff0c;由于其工作在幾百kHz的高頻開關狀態&#xff0c;故易成為干擾源。電磁兼容性EMC&#xff08;Electro Magnetic Compatibility&#xff09;&#xff0c;是指設備或系統在其電磁環境中符合要求運行并不對其環境中的任何設備產生無法忍受的電磁干擾的…

react父調用子的方法,子調用父的方法

父調用子的方法 // 子組件 import React, { useRef, useEffect } from react;const ChildComponent ({ childMethodRef }) > {const childMethod useRef(null);useEffect(() > {childMethodRef.current childMethod;}, []);const someMethod () > {console.log(子…

量化交易的實戰操作與心得

量化交易&#xff0c;作為一種基于數學模型和算法執行交易的方法&#xff0c;已經在全球金融市場中取得了廣泛的應用。對于從事量化交易的投資者而言&#xff0c;了解實戰操作的具體細節及相關心得是至關重要的&#xff0c;它可以幫助投資者優化策略&#xff0c;提高交易效率&a…

浪潮天啟防火墻TQ2000遠程配置方法SSL-xxx、L2xx 配置方法

前言 本次設置只針對配置VXX&#xff0c;其他防火墻配置不涉及。建議把防火墻內外網都調通后再進行Vxx配置。 其他配置可參考&#xff1a;浪潮天啟防火墻配置手冊 配置SSLVxx 在外網端口開啟SSLVxx信息 開啟SSLVxx功能 1、勾選 “啟用SSL-Vxx” 2、設置登錄端口號&#xff0…

springboot零食盒子-計算機畢業設計源碼50658

目 錄 1 緒論 1.1 研究背景 1.2研究意義 1.3論文結構與章節安排 2 微信小程序的零食盒子系統分析 2.1 可行性分析 2.2 系統流程分析 2.2.1 數據流程 3.3.2 業務流程 2.3 系統功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系統用例分析 2.5本章小結 3 微信…

力扣-排序算法

排序算法&#xff0c;一般都可以使用std&#xff1a;&#xff1a;sort&#xff08;&#xff09;來快速排序。 這里介紹一些相關的算法&#xff0c;鞏固記憶。 快速排序 跟二分查找有一丟丟像。 首先選擇一個基準元素&#xff0c;一般就直接選擇第一個。然后兩個指針&#xff0c…

編程玩具應用前景怎么樣:深入剖析四大方面、五大趨勢、六大挑戰與七大機遇

編程玩具應用前景怎么樣&#xff1a;深入剖析四大方面、五大趨勢、六大挑戰與七大機遇 在科技飛速發展的今天&#xff0c;編程玩具作為一種新興的教育工具&#xff0c;正逐漸走進人們的視野。那么&#xff0c;編程玩具的應用前景究竟如何呢&#xff1f;本文將從四個方面、五個…

測試類型介紹-安全性測試實戰技巧

安全性測試實戰技巧 在當今數字化時代&#xff0c;軟件安全不再是可選項&#xff0c;而是每一款產品的必備特性。隨著網絡攻擊的復雜性和頻率不斷上升&#xff0c;安全性測試成為了確保應用程序健壯性和用戶數據保護的關鍵環節。 1. 安全性測試的重要性? 安全性測試旨在識別…

Java如何使用 HttpClientUtils 發起 HTTP 請求

Java如何使用 HttpClientUtils 發起 HTTP 請求 一、前言1.HttpClientUtils 類概覽2.解析 HttpClientUtils 類3.使用 HttpClientUtils 類 一、前言 在現代的軟件開發中&#xff0c;經常需要與遠程服務器進行通信&#xff0c;例如獲取數據或發送數據。Apache HttpClient 是一個流…