VPN:MD5認證算法原理
MD5(Message-Digest Algorithm 5,信息摘要算法第5版)是計算機廣泛使用的散列算法(也稱“哈希算法”或“雜湊算法”)之一,采用帶密鑰的運算時,可同時用于消息完整性檢測和消息源身份認證。它是由MD2、MD3和MD4版本一路發展而來,是Ronald Rivest 于1991年設計發布的,用于取代MD4。
1. MD5算法基本認證原理
盡管不同版本的MD算法的具體原理肯定有所區別,但它們的基本工作機制卻是一樣的:都是先在發送端將一個隨機長度的消息(在帶密鑰運算的情況下,除包括原始消息外,還要同時包括雙方共知的密鑰)最終“壓縮”(當然,這里并不是簡單的壓縮,需要經過一系列的各種邏輯運算,以打亂原始消息的次序,生成的是一段看不懂的密文)成一個128位的消息摘要(也稱哈希值),并隨著原始消息一起發送。
原始消息,連同摘要消息一起到了接收端后,再采用相同的方法對所接收到的原始消息(在帶密鑰運算的情況下,還要包括雙方共知的密鑰)進行“壓縮”,看生成的消息摘要是否與隨著原始消息一起發送過來的消息摘要一致,一致則認為所接收的消息是完整的,在傳輸途中沒有被非法篡改。
因為在帶密鑰的MD5消息摘要的運算中,不是直接基于原始消息進行計算的,還要與機密的預共享密鑰(采用預共享密鑰認證方法時),或者本端的公鑰(采用數字證書認證方法時)結合起來計算的,而預共享密鑰和本端公鑰只有發送者和接收者才知道的,所以能保證摘要計算的機密性,產生獨一無二的“數字指紋”,起到了消息源身份認證的目的。
MD5摘要運算是不可逆的(即具有單向性,也稱之為“單向密鑰”),不可通過摘要消息還原出原始的消息。當然,其實所有身份認證算法都是這樣的,僅用于認證,不需要在接收端進行數據還原。也正因為如此,MD5算法通常不認為是一種加密算法,不具有解密能力。
MD5算法的消息完整性驗證和消息源身份認證的基本過程可用圖1來描述。圖中的“MAC”就是指摘要消息。MD5算法的總體消息摘要運算過程如下:

圖1 MAC類算法基本工作原理示意
(1)把包括密鑰和初始消息在內的二進制比特串(假設稱之為“原始消息”),以及位于最后位置、新增的用于記錄要原始消息(包括密鑰和初始消息)的二進制64位長度一起被劃分成一個個的512位(16個32位字長)的塊。
雖然理論來說MD5算法可以計算的消息長度是任意的,即不受限制的,但是由于用于表示消息長度的二進制位只有64位,所以實際上它也最多只能計算264位的消息。如果消息長度超過這個值,則只會對低264位的消息進行計算。
(2)這些512位的塊再經過多輪“與”(And)、“或”(OR)、“非”(NOT)、“異或”(AOR)邏輯算法(具體算法我們可以不做了解)處理,最終會輸出四個32位分組,將這四個32位分組級聯后將生成一個128位散列值(消息摘要)。
2. MD5算法消息填充原理
因為大多原始數消息,加上用于表示原始消息長度的64位后可能仍不能恰好被512整除,也就是原始消息的二進制位數除以512后的余數不是488(512?64=448)。這時就表明需要對原始消息進行填充處理了。這里又有兩種情況:一是余數小于448,另一種就是余數大于448。
如果原始消息二進制位數除以512后的余數小于448,則先在原始消息的最后一個512位塊的最后填充一個1,然后再填充若干位0,使得該塊的原始消息總長度等于448位,然后加上用于標識原始消息長度的64位,正好形成一個512位的塊。
如一個有600位的消息,則可劃分成兩個512位的塊:第一個塊是512位全部為原始消息;第二個塊中有88位原始消息,然后進行填充:先在最后填充1位“1”,再填充359位“0”,使得88位原始信息+1位1+359位0=448位,最后再附上64位用于標識原始信息長度(600)的值。
如果如果原始消息二進制位數除以512后的余數大于448,這時要新增一個512位的塊了。首先是在原始消息的最后一個512位塊的最后填充一個1,然后再填充若干位0,使得該塊的原始消息總長度等于512位;接著再新增一個塊,前面448位均填充0,再加上用于標識原始消息長度的64位,形成新的一個512位塊。
如有一個1000位的消息,則最終會劃分成三個512位的塊:第一個塊是512位全部為原始消息;第二個塊中有488位原始消息,然后進行填充:先在最后填充1位“1”,再填充23位“0”,使得488位原始信息+1位1+23位0=512位;最后是一個新增的塊,也要進行填充:先在前面填充448位0,最后再附上64位用于標識原始信息長度(1000)的值。
3. MD5算法的主要應用
MD5除了應用于各種三層VPN通信的數據完整性驗證和消息源身份認證外,在我們在日常IT應用中也常見到它的身影,也經常用于數字簽名。
如我們常常在某些軟件下載站點的某軟件信息中看到其MD5值,它的作用就是用于在我們下載該軟件后對下載回來的文件用專門的軟件(如Windows MD5 Check等)做一次MD5校驗,以確保我們獲得的文件與該站點提供的文件為同一文件。利用MD5算法來進行文件校驗的方案被大量應用到軟件下載站、論壇數據庫、系統文件安全等方面。
另外,MD5還廣泛用于操作系統的登陸驗證上,如UNIX、各類BSD系統登錄密碼、數字簽名等諸多方。如在UNIX系統中用戶的密碼是以MD5(或其他類似的算法)經Hash運算后存儲在文件系統中。當用戶登錄的時候,系統把用戶輸入的密碼進行MD5 Hash運算,然后再去和保存在文件系統中的MD5值進行比較,進而確定輸入的密碼是否正確。通過這樣的步驟,系統在并不知道用戶密碼的明碼的情況下就可以確定用戶登錄系統的合法性。避免用戶的密碼被具有系統管理員權限的用戶知道。