python hashlib模塊算法
hashlib模塊
python中的hashlib為我們提供了常見的摘要算法,如MD5、sha1
那麽現在問題來了,摘要算法是what?
摘要算法又稱哈希算法、散列算法。
它指的是把任意長度的數據data,通過函數f(),轉換為一個長度固定的摘要digest(通常用16進制的字符串表示),
目的是為了發現原始的數據是否被人篡改過。
摘要算法之所以可以辨別數據是否被人篡改過,就是因為摘要函數是一個單向函數,
想要計算f(data)很容易,但是通過digest反推data卻非常困難。
並且,只要是對原始數據做哪怕一點點改動,都會導致計算出的摘要截然不同。
接下來我們以常見的摘要算法MD5為例,
#計算出一個字符串的MD5值 import hashlib md5 = hashlib.md5() md5.update(b‘hello,python‘) #ps:需要轉換成b字節或者encode(‘utf-8‘) print(md5.hexdigest())
輸出結果:
15ac32041ff74c93c1842b152df7519e
import hashlib md5 = hashlib.md5() md5.update(‘hello,python‘.encode(‘utf-8‘)) print(md5.hexdigest())
輸出結果:
15ac32041ff74c93c1842b152df7519e
如果數據量很大,可以分塊多次調用update(),
一段字符串分成幾段摘要和直接進行摘要的結果是相同的
import hashlib md5 = hashlib.md5() md5.update(b‘hello,‘) #原字符串中有逗號的不要忘記了 md5.update(b‘python‘) print(md5.hexdigest())
輸出結果:
15ac32041ff74c93c1842b152df7519e
模仿文件校驗
import hashlib def check_md5(filename): md5 = hashlib.md5() with open(filename,‘rb‘) as f: while True: content = f.read(2048) #分段讀取,以免占用大段內存 if content: md5.update(content) else: break return md5.hexdigest()
file1 = check_md5(‘md5_test1‘) #我創建的md5_test1中的數據為11112
file2 = check_md5(‘md5_test2‘) #我創建的md5_test2中的數據為11111
print(file1)
print(file2)
輸出結果:
afcb7a2f1c158286b48062cd885a9866
b0baee9d279d34fa1dfd71aadb908c3f
md5摘要加密傳輸進來的密碼,並動態加鹽提高安全性
import hashlib def md5_digest(salt,pwd): md5 = hashlib.md5(salt.encode(‘utf-8‘)) #salt,加鹽操作,增加安全性,而且還可以對鹽進行切片進一步增加安全性如salt[::-1] md5.update(pwd.encode(‘utf-8‘)) return md5.hexdigest() salt = ‘鹽‘ pwd = ‘123450‘ print(md5_digest(salt,pwd))
輸出結果:
684d41d1f7512e40a8939fd4fed9518a
經過Salt處理的MD5口令,只要Salt不被黑客知道,即使用戶輸入簡單口令,也很難通過MD5反推明文口令。
但是如果有兩個用戶都使用了相同的簡單口令比如123456,在數據庫中,將存儲兩條相同的MD5值,這說明這兩個用戶的口令是一樣的。有沒有辦法讓使用相同口令的用戶存儲不同的MD5呢?
如果假定用戶無法修改登錄名,就可以通過把登錄名作為Salt的一部分來計算MD5,從而實現相同口令的用戶也存儲不同的MD5。
摘要算法在很多地方都有廣泛的應用。要註意摘要算法不是加密算法,不能用於加密(因為無法通過摘要反推明文),只能用於防篡改,但是它的單向計算特性決定了可以在不存儲明文口令的情況下驗證用戶口令。
MD5是最常見的摘要算法,速度很快,生成結果是固定的128 bit字節,通常用一個32位的16進制字符串表示。
另一種常見的摘要算法是SHA1,調用SHA1和調用MD5完全一樣,就是將前面的md5改成sha1而己。
SHA1的結果是160 bit字節,通常用一個40位的16進制字符串表示。
比SHA1更安全的算法是SHA256和SHA512,不過越安全的算法越慢,而且摘要長度更長。
python hashlib模塊算法