python學習之-hashlib模組(加密演算法模組)
hash演算法模組內有很多種,如md5、sha1等,只是加密的程度不一樣
hash是一種演算法
該演算法接收傳入的文字內容,經過hash運算得到一串hash值
hash值具備三個特點:
1. 如果傳入的內容相同,得到hash一定相同
2. 不能根據hash值反推出內容(無法反解,但是目前已被破解)
3. 如果採用hash演算法固定,那麼hash值的長度也是固定的,即不會隨著內容的增多而變長
結合1+3===>檔案完整性校驗(網路傳輸中有可能應為網路問題丟失部分資料)
PS:如何做呢,用hash演算法將檔案生成一個hash值,使用者下載後也hash一次得到的值對比一樣就是完整的(服務端用什麼hash演算法,客戶端也要用相同演算法)
結合1+2===>傳輸密文密碼(傳輸過程中避免被黑客抓包盜取賬戶)
PS:如何做呢,使用者在客戶端註冊賬戶密碼時候會生成一個hash值,然後存入服務端,以後使用者登入只要輸入賬號密碼就會生成hash值,然後匹配服務端的hash即可
hashlib模組例項
import hashlib
m=hashlib.md5() #定義hashlib的加密演算法種類
m.update('你好啊'.encode('utf-8')) m.update('hello'.encode('utf-8'))
print(res) #36b20ffdd2e10c6feef8ca866f2ef3b2
print(len(res)) #36b20ffdd2e10c6feef8ca866f2ef3b2 #演算法固定長度固定,即不同的演算法長度一不一樣
PS:update可以多次傳入值(一次hash動作,不管傳入多少隻,得到的hash值只有一個)
PS:傳入的內容相同即得到的hash值也肯定相同
PS:用update方法將值傳入,但是必須傳入bytes型別,而且用encode編碼定義成指定編碼格式(圖片等任何轉成二進位制型別都可傳入)
如果傳入的內容相同,得到hash一定相同
m.update('你'.encode('utf-8'))
m.update('好啊h'.encode('utf-8'))
m.update('ello'.encode('utf-8'))
res=m.hexdigest()
print(res) #36b20ffdd2e10c6feef8ca866f2ef3b2
print(len(res)) #36b20ffdd2e10c6feef8ca866f2ef3b2
PS:不管原值如何拆分傳入,得到的hash值依舊一樣不會變,所以只要原值不變,hash一定不會變
PS:hexdigest()這個方法就是用來得到hash值
密碼校驗(加鹽操作,防止撞庫破解)
pwd=input('>>>: ').strip()
m=hashlib.md5()
m.update('天王蓋地虎'.encode('utf-8')) #這個位置就是加鹽操作
m.update(pwd.encode('utf-8')) #這個位置是使用者輸入內容
m.update('小雞燉蘑菇'.encode('utf-8')) #這個位置就是加鹽操作
print(m.hexdigest()) #hexdigest得到hash值
檔案完整性校驗
m=hashlib.md5()
with open('f.txt',mode='rb') as f:
for line in f: #讀取檔案用for迴圈,減小記憶體壓力
f.seek(100,0) #游標用seek從頭開始往後移動100個位元組
x = f.read(5) #讀取游標位置後5個位元組的內容
m.update(x)
hash_v=m.hexdigest()
print(hash_v) #一行行讀加起來得到的hash值就是一樣的
PS:檔案過大,for迴圈時間會很長,為了減少讀取時間,可以自己劃分檔案比例,有多少位元組劃分好,然後取幾個點進行匹配就行