1. 程式人生 > >python學習之-hashlib模組(加密演算法模組)

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迴圈時間會很長,為了減少讀取時間,可以自己劃分檔案比例,有多少位元組劃分好,然後取幾個點進行匹配就行