摘要算法簡介
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值:


1 #!/usr/bin/env python 2 # -*- coding: UTF-8 -*- 3 import hashlib 4 5 PRIVATE_KEY = 'key'#防止用默認的md5映射表反解密碼,可以在md5()調用時加入自己的key 6 hash1 = hashlib.md5(bytes(PRIVATE_KEY, encoding='utf-8')) 7 hash1.update(bytes('admin', encoding='utf-8')) 8 print(hash1.digest())#返回二進制摘要信息 9 print(hash1.hexdigest())#返回16進制摘要信息


b'\xf6\xc4Zq)l\x1de\xdb8%\xa7\xdcx\x1b\xc8'
f6c45a71296c1d65db3825a7dc781bc8
MD5是最常見的摘要算法,速度很快,生成結果是固定的128 bit字節,通常用一個32位的16進制字符串表示。
另一種常見的摘要算法是SHA1,調用SHA1和調用MD5完全類似:


1 #!/usr/bin/env python 2 # -*- coding: UTF-8 -*- 3 import hashlib 4 5 PRIVATE_KEY = 'key'#防止用默認的md5映射表反解密碼,可以在md5()調用時加入自己的key 6 hash2 = hashlib.sha1(bytes(PRIVATE_KEY, encoding='utf-8')) 7 hash2.update(bytes('admin', encoding='utf-8')) 8 print(hash2.digest()) 9 print(hash2.hexdigest())


b'6#i\xc2\xea\xbf$[J\xa4\x13\x99:}!g\x04D\xf5i' 362369c2eabf245b4aa413993a7d21670444f569
SHA1的結果是160 bit字節,通常用一個40位的16進制字符串表示。
小結
摘要算法在很多地方都有廣泛的應用。要注意摘要算法不是加密算法,不能用于加密(因為無法通過摘要反推明文),只能用于防篡改,但是它的單向計算特性決定了可以在不存儲明文口令的情況下驗證用戶口令。
以下是一個生成md5密文的函數:


1 def gen_md5_password(password): 2 hash_pwd = hashlib.md5(bytes(PRIVATE_KEY, encoding='utf-8')) 3 hash_pwd.update(bytes(password, encoding='utf-8')) 4 ret = hash_pwd.hexdigest() 5 return ret
?