Python MD5加密詳解以及多次加密的坑
阿新 • • 發佈:2018-11-23
在python中可以使用hashlib這個庫來使用MD5加密:
import hashlib
在使用MD5加密的使用要注意加密內容的編碼格式:
import hashlib //匯入hash庫函式
md5_object = hashlib.md5() //建立一個MD5物件
md5_object.update(b'admin') //新增去要加密的文字
md5_result = md5_object.hexdigest() //獲取加密結果
如果文字是中文的話,需要進行編碼編碼,可以轉為UTF-8、GBK、GB2312、GB18030,不分大小寫,因為GBK/GB2312/GB18030均是針對漢字的編碼,所以md5加密後結果一樣。
md5_object = hashlib.md5()
md5_object.update('admin'.encode(encoding='UTF-8'))
md5_result = md5_object.hexdigest()
print(md5_result)
檢視原始碼的解釋:
- update(arg): Update the hash object with the bytes in arg. Repeated calls
are equivalent to a single call with the concatenation of all
the arguments.
update方法只接受位元組資料,使用b‘admin’,或者使用encode方法,都是將資料轉為二進位制。
如果想要多次加密,一不小心加密結果和自己預期的不一樣,例如,第一次加密後,想對第一次加密結果再次加密,然後對第二次結果再次加密,然後將第三次結果作為最終加密結果。
text = 'admin' md5 = hashlib.md5() md5.update(text.encode('utf-8')) first_md5 = md5.hexdigest() md5.update(first_md5.encode('utf-8')) second_md5 = md5.hexdigest() md5.update(second_md5.encode('utf-8')) last_md5 = md5.hexdigest() 程式結果: first_md5: '21232f297a57a5a743894a0e4a801fc3' // 結果沒錯 second_md5: 'c0e024d9200b5705bc4804722636378a' // 結果錯誤 last_md5: '8c3bf9f4ae60758c70c0db64c6d247a8' // 結果錯誤 正確結果: first_md5: '21232f297a57a5a743894a0e4a801fc3' second_md5: 'c3284d0f94606de1fd2af172aba15bf3' last_md5: '77e2edcc9b40441200e31dc57dbb8829'
其實仔細一看很容易理解,我們上面加密都是使用同一md5物件,其實就是第一次update,md5物件就會將加密資料存起來,然後通過hexdigest方法加密,第二次使用update,這時候是將已經存起來的加密資料和第二次update的加密資料進行相加,然後將相加後的結果進行加密,以此類推,之後的加密過程都是這樣,這也解釋了為什麼和預期的加密結果不一樣。
如果想要和預期結果一樣,我們只需要每次加密就新建一個md5物件。
text = 'admin'
for i in range(3):
md5 = hashlib.md5()
md5.update(text.encode(encoding='UTF-8'))
md5_result = md5.hexdigest()
text = md5_result
print(md5_result)
Tip:
我們可以使用sql來獲取MD5加密,例如:
SELECT MD5('admin')