首先介紹一下MD5和SHA1
MD5
MD5的全稱是Message-Digest Algorithm 5(信息-摘要算法)。128位長度。目前MD5是一種不可逆算法。
具有很高的安全性。它對應任何字符串都可以加密成一段唯一的固定長度的代碼。
SHA1
SHA1的全稱是Secure Hash Algorithm(安全哈希算法) 。SHA1基於MD5,加密后的數據長度更長,
它對長度小於264的輸入,產生長度為160bit的散列值。比MD5多32位。
因此,比MD5更加安全,但SHA1的運算速度就比MD5要慢了。
Python 中的用法:
Python 內置的 hashlib 模塊就包括了 md5 和 sha1 算法。而且使用起來也極為方便
Example of MD5:
1 import hashlib
2
3 data = 'This a md5 test!'
4 hash_md5 = hashlib.md5(data)
5
6 hash_md5.hexdigest()
會輸出:
1 '0a2c0b988863f08471067903d8737962'
上面這段字符串就是 data 轉換后的MD5值。
MD5不僅僅是上面這個例子這樣用來處理字符串,還有更廣泛的用途:
- 加密網站注冊用戶的密碼。 (但去年的各大網站密碼泄漏事件確實讓人蛋疼……)
- 網站用戶上傳圖片 / 文件后,計算出MD5值作為文件名。(MD5可以保證唯一性)
- key-value數據庫中使用MD5值作為key。
- 比較兩個文件是否相同。(大家在下載一些資源的時候,就會發現網站提供了MD5值,就是用來檢測文件是否被篡改)
- ……
sha1的使用與MD5類似,就像下面這樣,所以不再講解SHA1:
import hashlib
hashlib.sha1('This is a sha1 test!').hexdigest()
處理大文件:
上面說過可以用MD5來檢測兩個文件是否相同,但想想,如果是兩個很大的文件,擔心內存不夠用,這時怎么辦?
這就要使用 update 方法了。代碼如下:
import hashlib
def get_file_md5(f):
m = hashlib.md5()
while True:
data = f.read(10240)
if not data:
break
m.update(data)
return m.hexdigest()
with open(YOUR_FILE, 'r') as f:
file_md5 = get_file_md5(f)
(windows 用戶 要使用 'rb'方式打開文件)
大家可以用下面這段代碼驗證一下:
import hashlib
x = hashlib.md5()
x.update('hello, ')
x.update('python')
x.hexdigest()
hashlib.md5('hello, python').hexdigest()
這兩次的輸出是一樣的。
SHA1 也是一樣的用法。