MD5算法加密的過程

2020-10-14 愛上資源

什麼是 MD5

MD5 是一種算法, MD5 中的 MD 代表 Message Digest, 也即信息摘要.

至於數字 5, 則因它是從更早的 MD4 算法改進而來, 因此得名 MD5.

所以 MD5 即是信息摘要算法第五版.

什麼是信息摘要算法

那什麼又是信息摘要算法呢? 它本質上就是一個哈希函數(hash function).

又叫散列函數.

那什麼又是哈希函數呢? 它是指這樣一種函數: 它能把任意大小的數據映射(map)為一個固定大小的值.

A hash function is any function that can be used to map data of arbitrary size to fixed-size values.

哈希函數所返回的這個值稱為哈希值(hash value), 又稱為哈希碼(hash codes), 或直接簡稱為哈希(hash).

具體例子

單純地這樣去講會比較抽象, 因此這裡引入具體例子來說明, 以 Java 為例, 可以這樣去計算 MD5:

public void rawMd5() throws NoSuchAlgorithmException { byte[] bytes = "hello".getBytes(StandardCharsets.UTF_8); MessageDigest md = MessageDigest.getInstance("MD5"); byte[] md5 = md.digest(bytes);}

注: 因為摘要計算的輸入是一個字節數組, 如果要計算字符串的摘要值, 則要轉成某種編碼的字節數組, 為保持一致, 應始終顯式使用同一種編碼, 比如 utf-8.

從以上代碼中也不難看出, 一個 MD5 函數的輸入和輸出都是字節數組 byte[].

而代碼中不能直接體現的一點則是: 輸入可以是任意大小的字節數組, 輸出則是固定大小的字節數組.

對於 MD5 算法而言, 這個輸出值是一個固定大小為 16 字節的數組, 然後因為每個字節(byte)有 8 個位(bit), 所以最終的輸出值是一個 16 × 8 = 128 位的二進位數. MD5 的值就是一個 128 位的二進位大整數.

比如下面就是一個具體的 MD5 的值, 以原始的 128 位二進位形式表示: 10001000100100011001000111110000100011111000000111010010110010101100010111101010000110011011110000111011111101111101100110111110

這個 MD5 值實際是對我的網站域名 xiaogd.net 作摘要的結果.

這個值的二進位形式實在是長得不要不要的, 所以一般會轉換為十六進位形式, 共 16 組具體為: 88 91 91 f0 8f 81 d2 ca c5 ea 19 bc 3b f7 d9 be. 依然還是很長, 但比二進位好多了.

隨便說一句, IPv6 的地址也是 128 bit 的, 所以也是像這般變態的長, 寫成 16 進位也還是很長, 壓根記不住...

最後通常還會去掉空格寫成一個緊湊的 32 個字符的字符串的形式: 889191f08f81d2cac5ea19bc3bf7d9be, 也即是我們最常見到的 MD5 值的形式.

但請不要誤解, MD5 的值並不是一個字符串, 更不是什麼字母都能出現在裡邊的.

術語和符合

本文中一個「字」是32位,一個「字節」是8位。

我們定義x_i代表「x減去I".如果減數是一個表達式,則用括號括住,如:x_{i+1}。同樣我們用^代表求冪,這樣x^i則代表x的i次冪。「+」代表「字」之間的相加,X<<< s代表X左移s位,not(X)表示對X進行按位補運算,X v Y表示按位或。X xor Y表示按位異或,XY表示按位與。

MD5算法描述

我們假設有一個b位長的信息作為輸入,然後我們算出他的摘要信息。b是一個非負整數,b有可能是0,不需要一定是8的倍數,可能會非常得大。我們將輸入信息描繪如下:

m_0 m_1 .. m_{b-1}

接下來的五步我們來算出它的摘要。

1、 填充

我們將輸入信息填充到長度對512取餘對於448。無論輸入信息的長度多少,填充總是會發生的,即使本身的長度就已經滿足模512對於448的情況下。

過程如下:

在輸入信息後添加一個「1」位,其餘添加「0」位使得輸入信息長度滿足對512取餘對於448。總的來說,至少添加一位,至多添加512位。


舉個例子:66


2、 補充數據長度

將輸入信息b用64位表示並添加到填充的數據之後,如果b大於2^64的話,則只取低64位。

至此,我們的處理結果剛好是512的倍數,等效的,也是16字的倍數,我們用M[0...N-1]來表示這個結果,其中N是16的倍數。


3、 初始化MD緩衝區

用一個四字的緩衝區(A,B,C,D)來計算消息摘要,這裡的A,B,C,D每一個都是一個32位的寄存器。這些寄存器的初始值如下,用16進位表示的,低位字節優先。

word A: 01 23 45 67word B: 89 ab dc edword C: fe dc ba 98word D: 76 54 32 10

4、 處理消息

我們首先需要定義四個輔助函數。

F(X,Y,Z) = XY v not(X) ZG(X,Y,Z) = XZ v Y not(Z)H(X,Y,Z) = X xor Y xor ZI(X,Y,Z) = Y xor (X v not(Z))

對於函數F來說,在每一位上F函數就像是一個選擇器:if X then Y else Z。

這一步需要一個64長度的表格T[1...64],由sin函數構造而成。T[i]是4294967296次運行abs(sin(i))的結果,以此類推即可。

我們需要進行一下處理

/* 處理原數據. */For i = 0 to N/16-1 do/* 將數據賦值給X. */For j = 0 to 15 doSet X[j] to M[i*16+j].end /* 結束對j的循環 *//* 把A保存位AA B保存為BB C保存為CC D保存位DD */AA = ABB = BCC = CDD = D/* 第一輪操作 *//* [abcd k s i] 表示如下操作a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */[ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4][ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8][ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12][ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16]/* 第二輪操作 *//* [abcd k s i] 表示如下操作a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */[ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20][ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24][ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28][ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32]/* 第三輪操作 *//* [abcd k s t] 表示如下操作a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */[ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36][ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40][ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44][ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48]/* 第四輪操作 *//* [abcd k s t] 表示如下操作a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */[ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52][ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56][ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60][ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64]A = A + AAB = B + BBC = C + CCD = D + DDend /* 結束對i的循環 */

5、 輸出

上一步輸出最終的結果A,B,C,D。我們從A的低位字節開,到D的高位字節結束,每一個都是32位,最終拼接的結果就是4*32 = 128位,這就是MD5結算的結果。

相關焦點

  • 加密算法極先鋒之MD5算法
    在開發過程中,避免不了要涉及到數據加密,比如用戶帳號密碼的加密,用戶敏感數據的加密,涉及到的加密算法種類繁多,作為拿來主義的開發者時間精力有限,能夠清楚其中主流的加密算法和用途,就已經足夠了。主要的數據加密算法主要有:md5、sha、aes、des、rsa、base64等等。先來看看我們的老熟人:md5算法,幾乎在任何一個系統中,都少不了他的身影。MD5算法全稱叫MessageDigestAlgorithm5(信息摘要算法5),是數字摘要算法的一種實現,摘要長度為128位。
  • MD5加密方式
    什麼是MD5MD5加密全程是Message-Digest Algoorithm 5(信息-摘要算法),它對信息進行摘要採集,再通過一定的位運算,最終獲取加密後的MD5字符串。例如我們要加密一篇文章,那麼我們會隨機從每段話或者每行中獲取一個字,把這些字統計出來後,再通過一定的運算獲得一個固定長度的MD5加密後信息。因此,其很難被逆向破解。 實質上,MD5 只是一種哈希算法。MD5有哪些特點1、針對不同長度待加密的數據、字符串等等,其都可以返回一個固定長度的MD5加密字符串。
  • CSharp如何運用MD5算法加密密碼?
    MD5(Message-Digest Algorithm 5)是一種廣泛使用的「消息-摘要算法」。這是一個單項散列函數,數據經過單向散列函數獲取一個固定長度的散列值,資料庫的籤名就是計算資料庫的散列值,MD5算法的散列值為128位。
  • 找回MD5加密的密碼及MD5加密資料庫中數據
    有時,在開發過程中,如果不小心更改掉了項目管理員帳號的密碼而又忘了,存在資料庫裡的密碼又是MD5加密後的,這時候怎麼辦?最為菜鳥的我,剛開始也很迷茫,不過向前輩們請教了請教,自己也查了查資料,特意整理記錄一下,並分享給大家。
  • 小叮噹Python進階(二):爬蟲與加密算法Part2之MD5
    MD5MD5全稱為message-digest algorithm 5(信息-摘要算法)。我們經常說的「MD5加密」,指的就是它---信息-摘要算法。MD5加密算法強大到,一個字符串,或文件,或壓縮包,執行MD5後,就可以生成一個固定長度為128bit的編碼串。
  • 超棒的MD5加密工具
    MD5是一種不可逆的加密算法,全稱是Message-Digest Algorithm 5(信息-摘要算法)。是當前計算機領域用於確保信息傳輸完整一致而廣泛使用的散列算法之一。MD5的典型應用是對一段信息(Message)產生信息摘要(Message-Digest),以防止被篡改。
  • Javaweb之Filter案例練習-自動登錄問題和MD5加密
    MD5加密第一個要知道的是MD5(Message-Digest Algoorithm 5)是一種不可逆的加密算法。也就是只能加密,不能解密操作。那麼我們登錄是如何做到呢,一般來說資料庫中用戶名密碼肯定採用MD5加密。在後臺拿到前端獲取密碼,然後把這個密碼通過MD5加密,然後傳入資料庫和密碼這欄比較,相等就說明密碼一樣。
  • JAVA上加密算法的實現用例
    數據加密的基本過程就是對原來為明文的文件或數據按某種算法進行處理,使其成為不可讀的一段代碼為「密文」,使其只能在輸入相應的密鑰之後才能顯示出原容,通過這樣的途徑來達到保護數據不被非法人竊取、閱讀的目的。通過修改文件的md5值,可以繞過某些網盤的&34;,這是因為網盤伺服器內存儲著已知違規文件的md5值,當上傳文件時會自動與伺服器md5資料庫匹配以判斷是否違規。
  • ASP.NET中MD5與SHA1加密的幾種方法
    所以你很難從加密後的文字中找到蛛絲馬跡。SHA1的全稱是Secure Hash Algorithm(安全哈希算法)MD5 算法的哈希值大小為128位。而SHA1 算法的哈希值大小為160位。兩種算法都是不可逆。
  • asp.net中的MD5加密,無碰撞不可逆,加保險更安全
    MD5將任意長度的「字節串」變換成一個128bit的大整數,並且它是一個不可逆的字符串變換算法。換句話說就是,即使你看到源程序和算法描述,也無法將一個MD5的值變換回原始的字符串,從數學原理上說,是因為原始的字符串有無窮多個,這有點象不存在反函數的數學函數。MD5簡單來說就是把一段明文通過某種算法某個公式進行運算得出密文的一個過程。
  • C Sharp程式語言如何實現MD5加密的一個實例分享
    一、MD5介紹:MD5在軟體行業是再常見不過的一個詞了,即使你從沒使用過它,也不知道它到底是個什麼東西,但你肯定聽過這個詞MD5的全稱是message-digest algorithm 5(信息-摘要算法
  • Go 加密解密算法總結
    對稱式:對稱加密(也叫私鑰加密)指加密和解密使用相同密鑰的加密算法。具體算法主要有DES算法,3DES算法,TDEA算法,Blowfish算法,RC5算法,IDEA算法。非對稱加密(公鑰加密):指加密和解密使用不同密鑰的加密算法,也稱為公私鑰加密。具體算法主要有RSA、Elgamal、背包算法、Rabin、D-H、ECC(橢圓曲線加密算法)。數字籤名:數字籤名是非對稱密鑰加密技術與數字摘要技術的應用。
  • Python 中的加密操作 (base64、MD5)
    base64 編碼加密import base64想將字符串轉編碼成 base64, 要先將字符串轉換成二進位數據url = 「18322223360import base64url = 「aHR0cHM6Ly93d3cuY25ibG9ncy5jb20vc29uZ3poaXh1ZS8=」str_url = base64.b64decode(url).decode(「utf-8」)print(str_url)MD5 加密
  • Java安全之安全加密算法
    了解的層次只是基於加密算法的一些應用上。也來淺談一下加密算法在安全領域中的作用。寫本篇文也是基於算法的應用和實現,也是我的基本原則,能用就行。MD5md5的運用範圍也比較廣,比如在一些資料庫存儲密碼的時候會去使用到該算法去進行加密存儲。當然也可以看到網上的一些md5破解的。但是他們都是基於彩虹表去跑,使用字典進行md5加密,然後把加密的值進行對比,從而判斷該md5值的明文。
  • Postman使用MD5加密籤名的兩種方法
    Postman使用MD5加密籤名的兩種方法軟體介紹Postman是用戶在開發、調試網絡程序或者是網頁時候來跟蹤網絡請求的,可以發送幾乎所有類型的HTTP請求!Postman在發送網絡HTTP請求方面可以說是網絡調試類產品中的代表產品。
  • Postman使用MD5加密籤名的兩種方法
    Postman使用MD5加密籤名的兩種方法軟體介紹Postman是用戶在開發、調試網絡程序或者是網頁時候來跟蹤網絡請求的,可以發送幾乎所有類型的HTTP請求!Postman在發送網絡HTTP請求方面可以說是網絡調試類產品中的代表產品。
  • Java加密與解密之消息摘要算法1
    我們一般通過這類算法來加密我們的密碼,比如用戶在我們的web頁面註冊後,我們會把用戶設置的密碼通過md5或者sha來加密。環境:JDK1.8代碼示例:public class MD5Demo { private static final String ALGORITHM = "md5" ; /** * <p> * MD5消息摘要算法 * </p> * 2020年10月8日 下午1:33:18 * @author
  • 為什麼說MD5是不可逆的?
    首先科普一下md5在網絡安全中的作用、md5的算法原理,再說說為什麼MD5是不可逆的。md5主要用於兩個場景:場景一:在數據傳輸中,保證數據的完整性,以及數據不被篡改這裡並不是為了數據加密,只是用來證明,數據傳輸中沒經過中間人的惡意篡改,放心讀取就好。
  • JAVA實現消息摘要算法加密
    二、MD算法2.1、JDK實現MD算法1.使用JDK的MessageDigest類,使用該類的getInstance靜態方法來獲取一個MessageDigest實例,方法參數是算法名稱。2.使用MessageDigest的digest(byte[] b)方法,把指定內容通過MD5進行加密,返回字節數組類型。
  • Java加密與解密:消息摘要算法MD5
    簡述MD5算法是典型的消息摘要算法,其前身有MD2、MD3和MD4算法,它由MD4、MD3和MD2算法改進而來。不論是哪一種MD算法,它們都需要獲得一個隨機長度的信息並產生一個123位的信息摘要。如果將這個128位的二進位摘要信息換算成十六進位,可以得到一個32位的字符串,故我們見到的大部分MD5算法的數字指紋都是32為十六進位的字符串。