一:hashlib簡介
1、什么叫hash:hash是一種算法(不同的hash算法只是復雜度不一樣)(3.x里代替了md5模塊和sha模塊,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法),該算法接受傳入的內容,經過運算得到一串hash值
2、hash值的特點是(hash值/產品有三大特性:):
2.1 只要傳入的內容一樣,得到的hash值必然一樣=====>要用明文傳輸密碼文件完整性校驗
2.2 不能由hash值返解成內容=======》把密碼做成hash值,不應該在網絡傳輸明文密碼(只能有內容返回hash值)
2.3 只要使用的hash算法不變,無論校驗的內容有多大,得到的hash值長度是固定的(如從網上下載文件要進行hash校驗,保證網絡傳輸沒有丟包)
基於2.1和2.3可以做文件下載一致性的校驗
基於2.1和2.2可以對用戶密碼進行加密
hash算法就像一座工廠,工廠接收你送來的原材料(可以用m.update()
為工廠運送原材料),經過加工返回的產品就是hash值
二:將指定的 “字符串” 進行加密。使用hashlib的分步解析
1)在進行md5哈希運算前,需要對數據進行編碼,否則報錯
import hashlib obj = hashlib.md5() #構造一個hashlib的對象 obj.update("小馬過河") #update對指定字符串進行加密 print(obj) --------------結果: obj.update("小馬過河") TypeError: Unicode-objects must be encoded before hashing
2)obj是hash對象
import hashlib obj = hashlib.md5() obj.update("小馬過河".encode("utf-8")) print(obj,type(obj)) -------------------結果: <md5 HASH object @ 0x001C5590> <class '_hashlib.HASH'>
3)
import hashlib obj = hashlib.md5() obj.update("小馬過河".encode("utf-8")) result=obj.hexdigest() print(result) --------------結果: 24f67b0f6d02adc8867d612e0e0fc40a
4)給加密增添難度
import hashlib obj = hashlib.md5("mcw@xiaoma@aaaafffff".encode("utf-8")) #添加一些內容,提高加密復雜度。此處的字符串也要先編碼, obj.update("小馬過河".encode('utf-8')) result = obj.hexdigest() print(result) -------------------結果: b11740508f28e04837f2c0e3a58cf990
5)用hashlib做成加密函數(添加基礎的字符了的)
import hashlib def get_md5(data): #傳參為需要加密的字符串 obj = hashlib.md5("sidrsicxwersdfsaersdfsdfresdy54436jgfdsjdxff123ad".encode('utf-8')) obj.update(data.encode('utf-8')) result = obj.hexdigest() return result val = get_md5('123') print(val) --------------結果: 35093270b6352fa9721370b781f7b4d7
三:應用場景案例:用戶賬號密碼登錄,對明文密碼進行加密
import hashlib USER_LIST = [] def get_md5(data): obj = hashlib.md5("12:;idrsicxwersdfsaersdfsdfresdy54436jgfdsjdxff123ad".encode('utf-8')) obj.update(data.encode('utf-8')) result = obj.hexdigest() return result def register(): print('**************用戶注冊**************') while True: user = input('請輸入用戶名:') if user == 'N': return pwd = input('請輸入密碼:') temp = {'username':user,'password':get_md5(pwd)} USER_LIST.append(temp) def login(): print('**************用戶登陸**************') user = input('請輸入用戶名:') pwd = input('請輸入密碼:') for item in USER_LIST: if item['username'] == user and item['password'] == get_md5(pwd): return True register() result = login() if result: print('登陸成功') else: print('登陸失敗') ------------------------結果: **************用戶注冊************** 請輸入用戶名:小馬過河 請輸入密碼:123456 請輸入用戶名:N **************用戶登陸************** 請輸入用戶名:小馬過河 請輸入密碼:123456 登陸成功
#用戶登錄場景分析:實現用戶注冊,然后進行用戶登錄的代碼分析。
#代碼分析:
1、用戶登錄需要使用密碼,密碼一定要加密,保證用戶的信息安全。
1)加密可以使用hashlib模塊進行加密。
2)加密可以寫成加密函數
3)提高密碼解密的復雜性,代碼中多加字符串。(加密算法雖然依然非常厲害,但是也存在缺陷,即:通過撞庫可以反解。所以,有必要對加密算法中添加自定義key再來做加密。)
2、用戶注冊寫成用戶注冊的函數,用戶登錄寫成用戶登錄的函數。
3、先執行用戶注冊的函數,再執行用戶登錄的函數
4、注冊與登錄需要交互,用到input函數接收用戶輸入
5、如果用戶注冊和用戶登錄用到死循環,那么就要判斷用什么來終止循環(比如這里是輸入N)
6、用戶注冊提交的密碼加密的密文寫入數據庫。、用戶注冊提交的密碼加密的密文寫入數據庫。
7、用戶登錄輸入的密碼,使用相同加密函數加密后與數據庫密文比對,相等就登錄,否則就失敗
8、登錄的本質是判斷從用戶接收的加密后密文和注冊時存入數據庫的密文對比,用戶名密文對比成功,則繼續往下執行登錄后的操作。
9、用戶輸入密碼要防止旁人看到,可以使用getpass模塊
10、與密碼相關的很重要,一定要加密。包括自己擁有的影響大的重要數據也要加密,防止黑客入侵獲取而泄密。
四:校驗文件的一致性(如何保證下載的文件過程中不丟包,保證下載數據的完整性)
五:破解用戶注冊的密碼
六、hmac模塊的加密方式,與hashlib類似
參考鏈接:
https://www.cnblogs.com/sui776265233/p/9224754.html 男孩
https://www.cnblogs.com/breezey/p/6664733.html
查看鏈接:
https://blog.csdn.net/secret5/article/details/70150486