標籤:bsp break 校正 速度 分塊 長度 產生 bae hashlib
hashlib模組
python中的hashlib為我們提供了常見的摘要演算法,如MD5、sha1
那麼現在問題來了,摘要演算法是what?
摘要演算法又稱雜湊演算法、散列演算法。
它指的是把任意長度的資料data,通過函數f(),轉換為一個長度固定的摘要digest(通常用16進位的字串表示),
目的是為了發現原始的資料是否被人篡改過。
摘要演算法之所以可以辨別資料是否被人篡改過,就是因為摘要函數是一個單向函數,
想要計算f(data)很容易,但是通過digest反推data卻非常困難。
並且,只要是對未經處理資料做哪怕一點點改動,都會導致計算出的摘要截然不同。
接下來我們以常見的摘要演算法MD5為例,
#計算出一個字串的MD5值import hashlibmd5 = hashlib.md5()md5.update(b‘hello,python‘) #ps:需要轉換成b位元組或者encode(‘utf-8‘)print(md5.hexdigest())
輸出結果:
15ac32041ff74c93c1842b152df7519e
import hashlibmd5 = hashlib.md5()md5.update(‘hello,python‘.encode(‘utf-8‘))print(md5.hexdigest())
輸出結果:
15ac32041ff74c93c1842b152df7519e
如果資料量很大,可以分塊多次調用update(),
一段字串分成幾段摘要和直接進行摘要的結果是相同的
import hashlibmd5 = hashlib.md5()md5.update(b‘hello,‘) #原字串中有逗號的不要忘記了md5.update(b‘python‘)print(md5.hexdigest())
輸出結果:
15ac32041ff74c93c1842b152df7519e
模仿檔案校正
import hashlibdef 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 hashlibdef 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模組演算法