hashlib

Python的hashlib提供了常見的摘要算法,如MD5,SHA1等等。

什麼是摘要算法呢?摘要算法又稱哈希算法、散列算法。它通過一個函數,把任意長度的數據轉換爲一個長度固定的數據串(通常用16進制的字符串表示)。

舉個例子,你寫了一篇文章,內容是一個字符串'how to use python hashlib - by Michael',並附上這篇文章的摘要是'2d73d4f15c0db7f5ecb321b6a65e5d6d'。如果有人篡改了你的文章,並發表爲'how to use python hashlib - by Bob',你可以一下子指出Bob篡改了你的文章,因爲根據'how to use python hashlib - by Bob'計算出的摘要不同於原始文章的摘要。

可見,摘要算法就是通過摘要函數f()對任意長度的數據data計算出固定長度的摘要digest,目的是爲了發現原始數據是否被人篡改過。

摘要算法之所以能指出數據是否被篡改過,就是因爲摘要函數是一個單向函數,計算f(data)很容易,但通過digest反推data卻非常困難。而且,對原始數據做一個bit的修改,都會導致計算出的摘要完全不同。

我們以常見的摘要算法MD5爲例,計算出一個字符串的MD5值:

import hashlib


md5 = hashlib.md5()

md5.update('how to use md5 in python hashlib?')

print md5.hexdigest()

計算結果如下:

d26a53750bc40b38b65a520292f69306

如果數據量很大,可以分塊多次調用update(),最後計算的結果是一樣的:

md5 = hashlib.md5()

md5.

update('how to use md5 in ')

md5.update('python hashlib?')

print md5.hexdigest()

試試改動一個字母,看看計算的結果是否完全不同。

MD5是最常見的摘要算法,速度很快,生成結果是固定的128 bit字節,通常用一個32位的16進制字符串表示。

另一種常見的摘要算法是SHA1,調用SHA1和調用MD5完全類似:

import hashlib


sha1 = hashlib.sha1()

sha1.

update('how to use sha1 in ')

sha1.update('python hashlib?')

print sha1.hexdigest()

SHA1的結果是160 bit字節,通常用一個40位的16進制字符串表示。

比SHA1更安全的算法是SHA256和SHA512,不過越安全的算法越慢,而且摘要長度更長。

有沒有可能兩個不同的數據通過某個摘要算法得到了相同的摘要?完全有可能,因爲任何摘要算法都是把無限多的數據集合映射到一個有限的集合中。這種情況稱爲碰撞,比如Bob試圖根據你的摘要反推出一篇文章'how to learn hashlib in python - by Bob',並且這篇文章的摘要恰好和你的文章完全一致,這種情況也並非不可能出現,但是非常非常困難。


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