Python的hashlib
阿新 • • 發佈:2017-12-27
c2c digest 算法應用 enc alice rand 不一致 ice 分塊
Python的hashlib提供了常見的摘要算法,如MD5,SHA1等等。
什麽是摘要算法呢?摘要算法又稱哈希算法、散列算法。它通過一個函數,把任意長度的數據轉換為一個長度固定的數據串(通常用16進制的字符串表示)。
常見的摘要算法MD5為例,計算出一個字符串的MD5值:
import hashlib md5 = hashlib.md5() md5.update(‘how to use md5 in python hashlib?‘.encode(‘utf-8‘)) print(md5.hexdigest())
如果數據量很大,可以分塊多次調用update()
,最後計算的結果是一樣的:
import hashlib md5 = hashlib.md5() md5.update(‘how to use md5 in ‘.encode(‘utf-8‘)) md5.update(‘python hashlib?‘.encode(‘utf-8‘)) print(md5.hexdigest())
調用SHA1和調用MD5完全類似
import hashlib sha1 = hashlib.sha1() sha1.update(‘how to use sha1 in ‘.encode(‘utf-8‘)) sha1.update(‘python hashlib?‘.encode(‘utf-8‘)) print(sha1.hexdigest())
摘要算法應用
摘要算法能應用到什麽地方?舉個常用例子:
任何允許用戶登錄的網站都會存儲用戶登錄的用戶名和口令。如何存儲用戶名和口令呢?方法是存到數據庫表中:
name | password |
---|---|
michael | 123456 |
bob | abc999 |
alice | alice2008 |
如果以明文保存用戶口令,如果數據庫泄露,所有用戶的口令就落入黑客的手裏。此外,網站運維人員是可以訪問數據庫的,也就是能獲取到所有用戶的口令。
正確的保存口令的方式是不存儲用戶的明文口令,而是存儲用戶口令的摘要,比如MD5:
username | password |
---|---|
michael | e10adc3949ba59abbe56e057f20f883e |
bob | 878ef96e86145580c38c87f0410ad153 |
alice | 99b1c2188db85afee403b1536010c2c9 |
當用戶登錄時,首先計算用戶輸入的明文口令的MD5,然後和數據庫存儲的MD5對比,如果一致,說明口令輸入正確,如果不一致,口令肯定錯誤
由於常用口令的MD5值很容易被計算出來,所以,要確保存儲的用戶口令不是那些已經被計算出來的常用口令的MD5,這一方法通過對原始口令加一個復雜字符串來實現,俗稱“加鹽”:
def calc_md5(password): return get_md5(password + ‘the-Salt‘)
經過Salt處理的MD5口令,只要Salt不被黑客知道,即使用戶輸入簡單口令,也很難通過MD5反推明文口令。
但是如果有兩個用戶都使用了相同的簡單口令比如123456
,在數據庫中,將存儲兩條相同的MD5值,這說明這兩個用戶的口令是一樣的。有沒有辦法讓使用相同口令的用戶存儲不同的MD5呢?
如果假定用戶無法修改登錄名,就可以通過把登錄名作為Salt的一部分來計算MD5,從而實現相同口令的用戶也存儲不同的MD5
# -*- coding: utf-8 -*- import hashlib, random def get_md5(s): return hashlib.md5(s.encode(‘utf-8‘)).hexdigest() class User(object): def __init__(self, username, password): self.username = username self.salt = ‘‘.join([chr(random.randint(48, 122)) for i in range(20)]) self.password = get_md5(password + self.salt) db = { ‘michael‘: User(‘michael‘, ‘123456‘), ‘bob‘: User(‘bob‘, ‘abc999‘), ‘alice‘: User(‘alice‘, ‘alice2008‘) }
Python的hashlib