一起談談MD5加密演算法

来源:http://www.cnblogs.com/whyhappy/archive/2016/03/30/5337044.html
-Advertisement-
Play Games

MD5是一個安全的散列演算法,輸入兩個不同的明文不會得到相同的輸出值,根據輸出值,不能得到原始的明文,即其過程不可逆;所以要解密MD5沒有現成的演算法,只能用窮舉法,把可能出現的明文,用MD5演算法散列之後,把得到的散列值和原始的數據形成一個一對一的映射表,通過比在表中比破解密碼的MD5演算法散列值,通過匹 ...


MD5是一個安全的散列演算法,輸入兩個不同的明文不會得到相同的輸出值,根據輸出值,不能得到原始的明文,即其過程不可逆;所以要解密MD5沒有現成的演算法,只能用窮舉法,把可能出現的明文,用MD5演算法散列之後,把得到的散列值和原始的數據形成一個一對一的映射表,通過比在表中比破解密碼的MD5演算法散列值,通過匹配從映射表中找出破解密碼所對應的原始明文。

對信息系統或者網站系統來說,MD5演算法主要用在用戶註冊口令的加密,對於普通強度的口令加密,可以通過以下三種方式進行破解:

(1)線上查詢密碼。一些線上的MD5值查詢網站提供MD5密碼值的查詢,輸入MD5密碼值後,如果在資料庫中存在,那麼可以很快獲取其密碼值。

(2)使用MD5破解工具。網路上有許多針對MD5破解的專用軟體,通過設置字典來進行破解。

(3)通過社會工程學來獲取或者重新設置用戶的口令。

因此簡單的MD5加密是沒有辦法達到絕對的安全的,因為普通的MD5加密有多種暴力破解方式,因此如果想要保證信息系統或者網站的安全,需要對MD5進行改造,增強其安全性,本文就是在MD5加密演算法的基礎上進行改進!

2.Md5演算法應用

舉個簡單的例子:字元串加密和文件加密

字元串加密

方式一:
public string GetMD5String(string pwd)
{
MD5CryptoServiceProvider md5=new MD5CryptoServiceProvide();
byte[] data=System.Text.Encoding.ASCII.GetBytes(pwd);
byte[] md5data=md5.ComputeHash(data);
StringBuilder builder=new StringBUilder();
for(int i=0;i<md5data.Length-1;i++)
{
builder.Append(md5data[i].ToString("X2"));    
}
return builder;
}
方式二:
public string GetMd5(string msg)
{
string cryptStr = "";
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] bytes = Encoding.UTF8.GetBytes(msg);
byte[] cryptBytes = md5.ComputeHash(bytes);
for (int i = 0; i < cryptBytes.Length; i++)
{
cryptStr += cryptBytes[i].ToString("X2");
}
return cryptStr;
}

文件加密

MD5加密文件

string GetFileMd5(string path)
{
string ctyptStr = "";
byte[] cryptBytes;
using (FileStream fs = new FileStream(path,FileMode.Open))
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
cryptBytes = md5.ComputeHash(fs);
}
for (int i = 0; i < cryptBytes.Length; i++)
{
ctyptStr += cryptBytes[i].ToString("X2");
}
return ctyptStr;
}

2.1Md5加密原理

MD5以512位分組來處理輸入的信息,且每一分組又被劃分為16個32位子分組,經過了一系列的處理後,演算法的輸出由四個32位分組組成,將這四個32位分組級聯後將生成一個128位散列值。

在MD5演算法中,首先需要對信息進行填充,使其位元組長度對512求餘數的結果等於448。因此,信息的位元組長度(Bits Length)將被擴展至N*512+448,即N*64+56個位元組(Bytes),N為一個正整數。填充的方法如下,在信息的後面填充一個1和無數個0,直到滿足上面的條件時才停止用0對信息的填充。然後再在這個結果後面附加一個以64位二進位表示的填充前的信息長度。經過這兩步的處理,現在的信息位元組長度=N*512+448+64=(N+1)*512,即長度恰好是512的整數倍數。這樣做的原因是為滿足後面處理中對信息長度的要求。MD5中有四個32位被稱作鏈接變數(Chaining Variable)的整數參數,他們分別為:A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210。 當設置好這四個鏈接變數後,就開始進入演算法的四輪迴圈運算,迴圈的次數是信息中512位信息分組的數目。

將上面四個鏈接變數複製到另外四個變數中:A到a,B到b,C到c,D到d。 主迴圈有四輪(MD4只有三輪),每輪迴圈都很相似。第一輪進行16次操作。每次操作對a、b、c和d中的其中三個作一次非線性函數運算,然後將所得結果加上第四個變數(文本中的一個子分組和一個常數)。

再將所得結果向右環移一個不定的數,並加上a、b、c或d中之一。最後用該結果取代a、b、c或d中之一。 以一下是每次操作中用到的四個非線性函數(每輪一個)。

其中,?是異或,∧是與,∨是或, 是反符號。 

如果X、Y和Z的對應位是獨立和均勻的,那麼結果的每一位也應是獨立和均勻的。F是一個逐位運算的函數。即,如果X,那麼Y,否則Z。函數H是逐位奇偶操作符。所有這些完成之後,將A,B,C,D分別加上a,b,c,d。然後用下一分組數據繼續運行演算法,最後的輸出是A,B,C和D的級聯。最後得到的A,B,C,D就是輸出結果,A是低位,D為高位,DCBA組成128位輸出結果。

2.2 MD5的安全性

從安全的角度講,MD5的輸出為128位,若採用純強力攻擊尋找一個消息具有給定Hash值的計算困難性為2128,用每秒可試驗1000000000個消息的電腦需時1.07×1022年。若採用生日攻擊法,尋找有相同Hash值的兩個消息需要試驗264個消息,用每秒可試驗1000000000個消息的電腦需時585年。

2.3 Md5加密演算法的應用

MD5加密演算法由於其具有較好的安全性,加之商業也可以免費使用該演算法,因此該加密演算法被廣泛使用,md5演算法主要運用在數字簽名、文件完整性驗證以及口令加密等方面。

3.改進後的加密方法

3.1目前md5加密方法利用的缺陷

在目前的信息系統中,對md5加密方法的利用主要通過在腳本頁面中引用包含md5加密函數代碼的文件,以asp腳本為例,在需要調用的頁面中加入,md5.asp為md5加密函數代碼文件,然後直接調用函數MD5(sMessage)即可,md5加密後的值有16位和32位之分,如果在md5加密函數中使用的是MD5 = LCase(WordToHex(a) & WordToHex(b) & WordToHex(c) & WordToHex(d)),則表示是32位,如果使用的是MD5=LCase(WordToHex(b) & WordToHex(c)),則表示是16位。例如對明文為“123456”的值進行加密,其md5值有兩個,如下所示:

A=123456 password=md5(A)= 49ba59abbe56e057 password=md5(A)= e10adc3949ba59abbe56e057f20f883e 如果將加密的md5值直接保存在資料庫,當網站存在註入或者其它漏洞時,入侵者極有可能獲取用戶的密碼值,通過md5在

如果將加密的md5值直接保存在資料庫,當網站存在註入或者其它漏洞時,入侵者極有可能獲取用戶的密碼值,通過md5線上查詢或者暴力破解可以得到密碼。 

3.2基於md5演算法的改進加密方法

本文提到的方法是在使用md5加密演算法對明文(口令)加密的基礎上,對密文進行了改變,在密文中截取一段數據並丟棄,

然後使用隨機函數填充被丟棄的數據,且整個過程不改變md5加密後的位數。其加密過程用演算法描述如下:

(1)對明文password進行md5加密,獲得密文md5(password)。

(2)使用截取函數截取加密後的密文,從第beginnumber位置開始截取number位數值,得到密碼A,其中A=left(md5(password),beginnumber-1)。

(3)使用截取函數截取加密後的明文的number位數後的值B,其中 B=right(md5(password),md5-digit -(beginnumber+number-1))。

(4)使用隨機函數gen_key(number)填充被截取的number的值。

(5)變換後的密碼值為encrypt_password =A&get_key(number)&B

變數說明:

解密過程跟加密過程有些類似,先對輸入的明文進行加密,接著從beginnumber處截取前半部分得到A′,後半部分得到B′,

然後從資料庫中讀出密碼中的A和B部分,最後如果A=A′並且B=B′,則認為用戶輸入的密碼跟資料庫中的密碼是匹配的。 

3.關鍵代碼與實現

本文提及改進方法關鍵實現代碼如下:

4.討論與結束語

有人也曾經提出對md5加密演算法中的函數或者變數進行修改,從而加強在使用原md5演算法的安全,

但是這種方法修改了md5原函數或者變數後,無法驗證修改後md5演算法在強度上是否跟原演算法一致。

本文提出的方法是在原有md5加密的基礎上,通過對密文截取一定位數的字元串,並使用隨機數進行填充,

最後得到的密文雖然是經過md5加密,但是其值已經大不一樣,因此通過md5常規破解方法是永遠也不能破解其原始密碼值,

從而保證了數據的安全。雖然目前有很多攻擊方法,諸如SQL註入、跨站攻擊等,可以較容易的獲取資料庫中的值,

通過本方法進行加密,在網站或者系統代碼泄露前,其數據是相對安全的,因此具有一定參考加值。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 看完覺得不錯,適合作為學習資料,就轉載過來了 原文鏈接:http://www.cnblogs.com/Wayou/archive/2012/09/20/EF_CodeFirst.html 這是上周就寫好的文章,是在公司浩哥的建議下寫的,本來是部門裡面分享求創新用的,這裡貼出來分享給大家。 最近在對M ...
  • 1.文件目錄操作命令 (1) ls 顯示文件和目錄列表 a ls -l 顯示文件的詳細信息 b ls -a 列出當前目錄的所有文件,包含隱藏文件。 c stat '目錄/文件' 顯示指定目錄/文件的相關信息,比ls命令顯示的內容更多 (2) mkdir '目錄' 創建目錄 (3) touch '文件 ...
  • 1:使用epplus合併多個excel文件到同一excel的不同sheet頁中 2:設置excel文件sheet頁的 頁邊距(使用epplus) ...
  • 來源:http://www.cnblogs.com/Wayou/archive/2012/09/20/EF_CodeFirst.html Entity Framework的全稱是ADO.NET Entity Framework,是微軟開發的基於ADO.NET的ORM(Object/Relationa ...
  • C#中的委托與游戲中的運用 1.什麼是委托 在C/C++中,有函數指針的概念,即指向函數的指針。當我們調用該指針時,就相當於調用了該指針所指向的函數,這就是函數指針的一個作用,而他另一個作用就是將自己作為其他函數的參數。 但是指針是直接訪問記憶體單元的,程式員對指針的不恰當使用常常會引發錯誤。因此作為 ...
  • 不做開篇廢話,我們發現: AdaptiveTrigger 不夠好 我們知道,UWP可以在一個頁面適應不同尺寸比例的屏幕。一般來說這個功能是通過官方推薦的AdaptiveTrigger 進行的。 比如這樣: 我們可以看到這樣的的Trigger制定了最小值,隱含了條件“當滿足長寬都大於於這個條件時,這個 ...
  • 1、web前臺頁面文件上傳的文件大小限制問題 1.1 通過Web.Config配置上傳文件的大小限制(涉及站點安全問題,謹慎配置!!!)。 1.2 通過後臺C#代碼進行上傳文件大小的限制。 上述兩種方法的使用可滿足不同的需求,並不是可以相互替代的解決方法。新手總結,還望讀者自行甄別使用。 2、.ne ...
  • 本博客不屬於技術貼,主要是記錄一些自己對不懂得地方的理解和學習的記錄,請帶著批判的眼光閱讀~ 值類型存儲在棧上,引用類型存儲在堆上。棧是由高到低存儲的,遵循先進後出的原則,是記憶體提前分配好的區域,記憶體的釋放不由人控制,用完後就會釋放記憶體。堆是動態分配的記憶體區域,是無序的,受人為控制釋放,但是達到一定 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...