# python的hashlib提供了常見的摘要算法,如md5(md5算法),sha1等等。摘要:digest # 摘要算法又稱哈希算法、散列算法。 # 它經過一個函數,把任意長度的數據(明文)轉換爲一個長度固定的數據串(密文)(一般用16進制的字符串表示)。 # 摘要算法就是經過摘要函數f()對任意長度的數據data計算出固定長度的摘要digest, # 目的是爲了發現原始數據是否被人篡改過。摘要算法之因此能指出數據是否被篡改過, # 就是由於摘要函數是一個單向函數,計算f(data)很容易,但經過digest反推data卻很是困難。 # 並且,對原始數據作一個bit的修改,都會致使計算出的摘要徹底不一樣。 # 要注意摘要算法雖然能夠用於加密,但網上有不少能夠解密的網站,存在必定的被破解的風險。 # 一個明文對應惟一密文。經常使用於對比登陸密碼和存儲在電腦的密碼或網站密碼(文件的一致性校驗)。 # 若是以明文保存用戶口令(用戶名或密碼),若是數據庫泄露,全部用戶的口令就落入黑客的手裏。黑客撞庫。 # 此外,網站運維人員是能夠訪問數據庫的,也就是能獲取到全部用戶的口令。 # 正確的保存口令的方式是不存儲用戶的明文口令,而是存儲用戶口令的摘要,好比md5 # 1. import hashlib md5 = hashlib.md5()#md5可改成sha1,比sha1更安全的算法是sha256和sha512,不過越安全的算法越慢,並且摘要長度更長。 md5.update(b'136320') #b'136320'至關於'136320'.encode('utf-8')。 print(md5.hexdigest())#d5d082d2642302fae506350fff337632,這是md5值,一個32位的16進制字符串。 # 2.若是數據量很大,能夠分塊屢次調用update(),最後計算的結果是同樣的: import hashlib md5 = hashlib.md5() md5.update(b'13') md5.update(b'6320')#13跟6320疊加的md5值跟136320的md5值是同樣的。 print(md5.hexdigest())#d5d082d2642302fae506350fff337632 # md5.update(b'136320') # print(md5.hexdigest())#d5d082d2642302fae506350fff337632 # 3. 用戶註冊,密碼是md5值: import hashlib username = input('username:') password = input('password:') md5 = hashlib.md5() #獲取md5對象 md5.update(bytes(password,encoding = 'utf-8')) #加密:md5.update密碼 md5_pwd = md5.hexdigest() #獲取md5值(密文) with open('username&password',mode = 'w',encoding = 'utf-8') as f: f.write('%s&%s'%(username,md5_pwd)) # 4. 用戶登陸驗證: import hashlib username = input('username:') password = input('password:') with open('username&password',encoding = 'utf-8') as f: for line in f: user,pwd = line.split('&') md5 = hashlib.md5() md5.update(bytes(password,encoding='utf-8')) #要寫上encoding='utf-8',否則會拋出string argument without an encoding md5_pwd = md5.hexdigest() if username == user and md5_pwd == pwd: print('登陸成功') else: print('帳戶或密碼不對') # 5. 加鹽:通過Salt處理的MD5口令,只要Salt不被黑客知道,即便用戶輸入簡單口令,也很難經過MD5反推明文口令,但也存在必定的被破解的風險。 import hashlib md5 = hashlib.md5(bytes('salt',encoding = 'utf-8'))#salt能夠是任意字符。 md5.update(b'136320') print(md5.hexdigest())#dc740385c07799eefb7c1f1ae24050ee # 加了鹽以後,md5值跟原來的d5d082d2642302fae506350fff337632不同。 #鹽後面還能夠加其餘字符:b'123' import hashlib md5 = hashlib.md5(bytes('salt',encoding = 'utf-8') + b'123') md5.update(b'136320') print(md5.hexdigest())