消息摘要(Message-Digest)壹般指消息的哈希變換,即將任意長度的字節串變換為具有壹定長度的大整數。請註意,我使用“字節字符串”壹詞而不是“字符串”,因為這種轉換只與字節值有關,與字符集或編碼方法無關。
MD5將任意長度的“字節字符串”轉換為128bit的大整數,它是壹種不可逆的字符串轉換算法。換句話說,即使您看到了源程序和算法的描述,您也無法將MD5值轉換回原始字符串。從數學上講,是因為有無限個原始字符串,有點像沒有反函數的數學函數。
MD5的典型應用是為消息(字節字符串)生成指紋以防止其被篡改。例如,如果您在壹個名為readme.txt的文件中寫了壹段話,並為此readme.txt生成壹個MD5值並記錄下來,那麽您可以將此文件傳播給他人。如果其他人修改了文件中的任何內容,您將在重新計算該文件的MD5時發現它。如果有第三方認證機構,MD5還可以防止文檔作者的“否認”,也就是所謂的數字簽名應用。
MD5也廣泛用於加密和解密技術。在許多操作系統中,用戶的密碼以MD5值的形式保存(或類似的其他算法)。當用戶登錄時,系統將用戶輸入的密碼計算為MD5值,然後與系統中保存的MD5值進行比較,但系統並不“知道”用戶的密碼是什麽。
壹些黑客破解這種密碼的方法是壹種叫做“運行字典”的方法。獲取字典的方法有兩種,壹種是日常收集的用作密碼的字符串表,另壹種是通過排列組合方法生成的。首先通過MD5程序計算這些字典項的MD5值,然後在該字典中搜索目標的MD5值。
即使密碼的最大長度為8,並且密碼只能是字母和數字,***26+26+10=62個字符,字典中的條目數也是P(62,1)+P(62,2)...+P(62,8)。
在許多電子商務和社區應用程序中,管理用戶帳戶是最常用的基本功能之壹。盡管許多應用服務器都提供了這些基本組件,但許多應用程序開發人員更喜歡使用關系數據庫來管理用戶,以獲得更大的管理靈活性。懶惰的方法是用戶的密碼通常在純文本或簡單轉換後直接存儲在數據庫中。因此,這些用戶的密碼對於軟件開發人員或系統管理員來說可以說不是秘密。本文的目的是介紹MD5的Java Bean的實現,同時給出壹個使用MD5處理用戶帳戶密碼的例子。這種方法使管理員和程序員無法看到用戶的密碼,盡管他們可以初始化密碼。但重要的壹點是保護用戶的密碼設置習慣。