【Python】hashlib模塊實現MD5加密

MD5消息摘要算法(英語:MD5 Message-Digest Algorithm),一種被計算機安全領域廣泛使用的密碼散列函數,可以產生出一個128位(16字節)的散列值(hash value),
用以提供消息的完整性保護,用於確保信息傳輸完整一致。
MD5是最常見的摘要算法,速度很快,生成結果是固定的128 bit字節,通常用一個32位的16進制字符串表示。

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

MD5算法具有以下特點:

1、壓縮性:任意長度的數據,算出的MD5值長度都是固定的。
2、容易計算:從原數據計算出MD5值很容易。
3、抗修改性:對原數據進行任何改動,哪怕只修改1個字節,所得到的MD5值都有很大區別。
4、弱抗碰撞:已知原數據和其MD5值,想找到一個具有相同MD5值的數據(即僞造數據)是非常困難的。
5、強抗碰撞:想找到兩個不同的數據,使它們具有相同的MD5值,是非常困難的。

MD5算法使用的特性:

方便存儲:MD5加密出來都是32位的字符串,能夠給定固定大小的空間存儲,傳輸,驗證
文件加密:MD5算法運用在文件加密上很有優勢,應爲只需要32爲字符串就能對一個巨大的文件進行驗證完整性
不 可 逆:MD5加密出來只會截取末尾32位,具有良好的安全性,如果是對於參數加密很難僞造MD5
加密損耗低:MD5算法加密對於性能的消耗微乎其微(速度快)

MD5算法的實際應用

1.密碼驗證
可以當做密碼驗證,爲了保證密碼不在cmd5網站上破譯,最好加鹽及亂序,也可以只取一部分md5加密後的內容。md5是不可逆算法,只要保證算法不變,就能和數據庫中的md5相匹配。
郵箱密碼驗證過程:首先用戶創建郵箱時,郵件系統會對密碼進行md5加密後存儲到數據庫,這個時候在數據庫裏面看到的密碼是加密的,保證密碼只能用戶自己知道,減少密碼泄漏的風險。
等到你登陸郵箱時,系統不是檢驗用戶的密碼,而是檢驗用戶輸入的密碼經md5加密以後和數據庫內加密密碼進行對比,判斷是否相等。

2.請求參數校驗
對於服務器來來說,除了系統問題最大的問題就是害怕請求被攔截,攔截後修改參數後就會出現很多漏洞的可能性。
爲了避免被攔截、參數被修改,常用方法就是對請求參數進行校驗,就算攔截了請求參數並修改它,只要模擬不出MD5加密出來的值,服務器過濾器直接就會進行攔截。
校驗過程:客戶端通過http或者https請求服務器時,對其中的參數按約定的MD5加密方法生成一個token,服務器接收信息後按照同樣的MD5加密方法生成一個值,然後對比客戶端傳過來的token進行對比,一致說明請求參數沒有被修改。

3.版權驗證
當一個視頻或者音頻創作出來的時候它的md5是唯一的,若以後有翻錄等版本出來,即使畫質,聲音,文件名都一樣,但是他們的md5驗證是不一樣的,所以可以驗證版權。
還比如用某一賬戶下載的視頻它的賬戶信息也會和視頻一起md5操作,如果以後這個人私自傳播通過md5就可以去數據庫中查找泄露版權的情況。

4.文件上傳
文件上傳時會上傳文件的信息,此時將文件的md5上傳,服務器中存儲這個md5值,並存儲這個md5值所對應的已上傳字節長度,比如未上傳對應爲0,已上傳對應爲-1,已上傳200字節就對應200,這個上傳的時候可以匹配到這個文件在服務器中的狀態,方便做斷點續傳,只要源文件沒有更改,即使換個名字,換個賬戶都可以在服務器找到對應的文件,所以當服務器中有已經上傳完畢的此文件時,別人再上傳這個文件就可以實現秒傳。

Python的hashlib提供了常見的摘要算法,如MD5,SHA1等等。
摘要算法又稱哈希算法、散列算法。它通過一個函數,把任意長度的數據轉換爲一個長度固定的數據串(通常用16進制的字符串表示)。
在python3的標準庫中,已經移除了md5模塊,而關於hash加密算法都放在hashlib這個標準庫中,如SHA1、SHA224、SHA256、SHA384、SHA512和MD5算法等。
具體代碼實現:

import hashlib
import time

encode = 'utf-8'                        # 編碼
appkey = 'md5test.'                     # 待加密信息

time_span = str(int(time.time()))
o_token = appkey                            # 可以對o_token進行處理appkey+time_span
hl = hashlib.md5()                          # 創建md5對象
hl.update(o_token.encode(encoding=encode))  # 轉換爲bytes
token = hl.hexdigest().upper()              # hexdigest() 加密過程
print('第一種MD5加密後爲 :' + token)

# 另一種寫法:b前綴代表的就是bytes
str_md5 = hashlib.md5(b'md5test.').hexdigest().upper()
print('第二種MD5加密後爲 :' + str_md5)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章