1. 程式人生 > >Python MD5加密詳解以及多次加密的坑

Python MD5加密詳解以及多次加密的坑

在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')