MD5碰撞原理簡單介紹及其實現
MD5是什么
MD5信息摘要算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼散列函數,可以產生出一個128位(16[字節]的散列值(hash value)),用於確保信息傳輸完整一致。MD5由美國密碼學家[羅納德·李維斯特](Ronald Linn Rivest)設計,於1992年公開,用以取代[MD4]算法。這套算法的程序在 RFC 1321 標准中被加以規范。1996年后該算法被證實存在弱點,可以被加以破解,對於需要高度安全性的數據,專家一般建議改用其他算法,如[SHA-2]。2004年,證實MD5算法無法防止碰撞,因此不適用於安全性認證,如[SSL]公開密鑰認證或是[數字簽名]等用途。
MD5的原理
直接看百度上的圖就一目了然了
MD5的“破解”
2004年,我國中科院院士王小雲證實md5算法無法防止碰撞,因此,不適用於安全性認證。在2005年,王小雲院士提出了md5哈希碰撞,公式如下
f(f(s, M), M') = f(f(s, N), N')
所謂的“破解”其實用“碰撞”一詞語更為妥當,因為她的研究成果表明了給定消息 M1
,能夠計算獲取 M2
,使得 M2
產生的散列值與 M1
產生的散列值相同,即:
MD5(M1)=MD5(M2)
於是乎MD5不滿足抗碰撞性,於是不再是安全的散列算法
但是
直到現在,給出一個MD5散列值,然后通過計算還原出原文來是不可能的的。也就是說通過一個MD5后的密文,回推明文目前還是沒有方法的。
這里給出相關論文:https://xueshu.baidu.com/usercenter/paper/show?paperid=7c9cd409db9bf2b5f06971928d6d7148&tn=SE_baiduxueshu_c1gjeupa&ie=utf-8
碰撞實現
這里介紹一個MD5碰撞的工具:fastcoll,fastcoll 可以用來對給定的前綴快速生成md5碰撞 (也就是說,生成兩個不同的文件,每個文件都是在給定的內容后面附加一段東西生成的)
給出其主頁:https://www.win.tue.nl/hashclash/
相關文章:https://homepages.cwi.nl/~stevens/papers/eprint-2006-104-S.pdf
下面給出示例,我們創建一個文本文檔在里面寫入123456789
將其拖入fastcoll后得到兩個文件
經過檢驗可以發現,第一個文檔和第二個文檔字符串不同,但最終MD5值相同
其他
之前打比賽的時候學習過一點技巧,可以通過python來爆破md5中的幾位,下面給出一份示例python代碼
1. import hashlib
2. for i in range(0,9999999999999999):
3. md5=hashlib.md5(str(i).encode("utf-8")).hexdigest()
4. if md5[0:5]=="66666": #md5后前五位是66666
5. print(i)
6. print("no result")
該腳本實現了純數字通過MD5加密后相應位數是特定字符的功能
最后
thanks for reading