Python算法模塊之hashlib模塊詳解
一:hashlib簡(jiǎn)介
什么叫hash
hash是一種算法(不同的hash算法只是復(fù)雜度不一樣)
3.x里代替了md5模塊和sha模塊,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
該算法接受傳入的內(nèi)容,經(jīng)過(guò)運(yùn)算得到一串hash值
hash值的特點(diǎn)
hash值/產(chǎn)品有三大特性:
- 只要傳入的內(nèi)容一樣,得到的hash值必然一樣=====>要用明文傳輸密碼文件完整性校驗(yàn)
- 不能由hash值返解成內(nèi)容=======》把密碼做成hash值,不應(yīng)該在網(wǎng)絡(luò)傳輸明文密碼(只能有內(nèi)容返回hash值)
- 只要使用的hash算法不變,無(wú)論校驗(yàn)的內(nèi)容有多大,得到的hash值長(zhǎng)度是固定的(如從網(wǎng)上下載文件要進(jìn)行hash校驗(yàn),保證網(wǎng)絡(luò)傳輸沒(méi)有丟包)
基于1和3可以做文件下載一致性的校驗(yàn)
基于1和2可以對(duì)用戶密碼進(jìn)行加密
hash算法就像一座工廠,工廠接收你送來(lái)的原材料(可以用m.update()為工廠運(yùn)送原材料),經(jīng)過(guò)加工返回的產(chǎn)品就是hash值
二:將指定的字符串進(jìn)行加密
使用hashlib的分步解析
1)在進(jìn)行md5哈希運(yùn)算前,需要對(duì)數(shù)據(jù)進(jìn)行編碼,否則報(bào)錯(cuò)
import hashlib obj = hashlib.md5() #構(gòu)造一個(gè)hashlib的對(duì)象 obj.update("小馬過(guò)河") #update對(duì)指定字符串進(jìn)行加密 print(obj) #結(jié)果: obj.update("小馬過(guò)河") TypeError: Unicode-objects must be encoded before hashing
2)obj是hash對(duì)象
import hashlib obj = hashlib.md5() obj.update("小馬過(guò)河".encode("utf-8")) print(obj,type(obj)) #結(jié)果: <md5 HASH object @ 0x001C5590> <class '_hashlib.HASH'>
3)查看16進(jìn)制結(jié)果
import hashlib obj = hashlib.md5() obj.update("小馬過(guò)河".encode("utf-8")) result=obj.hexdigest() print(result) #結(jié)果: 24f67b0f6d02adc8867d612e0e0fc40a
4)給加密增添難度
import hashlib obj = hashlib.md5("mcw@xiaoma@aaaafffff".encode("utf-8")) #添加一些內(nèi)容,提高加密復(fù)雜度。此處的字符串也要先編碼, obj.update("小馬過(guò)河".encode('utf-8')) result = obj.hexdigest() print(result) #結(jié)果: b11740508f28e04837f2c0e3a58cf990
5)用hashlib做成加密函數(shù)(添加基礎(chǔ)的字符了的)
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) #結(jié)果: 35093270b6352fa9721370b781f7b4d7
三:應(yīng)用場(chǎng)景案例
用戶賬號(hào)密碼登錄,對(duì)明文密碼進(jìn)行加密
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('**************用戶注冊(cè)**************') while True: user = input('請(qǐng)輸入用戶名:') if user == 'N': return pwd = input('請(qǐng)輸入密碼:') temp = {'username':user,'password':get_md5(pwd)} USER_LIST.append(temp) def login(): print('**************用戶登陸**************') user = input('請(qǐng)輸入用戶名:') pwd = input('請(qǐng)輸入密碼:') 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('登陸失敗') #結(jié)果: **************用戶注冊(cè)************** 請(qǐng)輸入用戶名:小馬過(guò)河 請(qǐng)輸入密碼:123456 請(qǐng)輸入用戶名:N **************用戶登陸************** 請(qǐng)輸入用戶名:小馬過(guò)河 請(qǐng)輸入密碼:123456 登陸成功
用戶登錄場(chǎng)景分析:實(shí)現(xiàn)用戶注冊(cè),然后進(jìn)行用戶登錄的代碼分析。
代碼分析:
四、校驗(yàn)文件的一致性
如何保證下載的文件過(guò)程中不丟包,保證下載數(shù)據(jù)的完整性
# -文件一致校驗(yàn)#-- '''可以拷貝一個(gè)文件放在兩個(gè)不同的盤中,然后通過(guò)判斷兩個(gè)文件的hash值是否相等,判斷兩個(gè)文件是否是同一個(gè)文件''' import hashlib m = hashlib.md5() with open(r'G:/logging模塊配圖.png','rb') as f: for line in f: m.update(line) print(m.hexdigest()) #47a6b079cc33a4f312786b46e61e0305 import hashlib m = hashlib.md5() with open(r'H:/logging模塊配圖.png','rb') as f: for line in f: m.update(line) print(m.hexdigest())
五、對(duì)明文密碼進(jìn)行加密
# 應(yīng)用:對(duì)明文密碼進(jìn)行加密(暴力破解--用明文密碼用一種算法算出一個(gè)hash值,與截取的hash值進(jìn)行比對(duì),比對(duì)成功說(shuō)明明文密碼一致,就可以破解用戶的密碼) '''如用戶在某網(wǎng)站進(jìn)行注冊(cè)信息,這個(gè)時(shí)候防止信息被惡意攔截獲取,可以對(duì)用戶明文密碼進(jìn)行加密,存成hash值得形式,這樣用戶每次登陸雖然輸?shù)氖敲魑拿艽a,校驗(yàn)hash值即可''' password=input('>>>>>:').strip() import hashlib m=hashlib.md5() m.update(password.encode('utf-8')) print(m.hexdigest()) #00dcbdaede875d5e23f1f9f64c7849ef # 對(duì)密碼進(jìn)行加鹽(暗號(hào))進(jìn)一步加強(qiáng)密碼的安全性 password=input('>>>>>:').strip() import hashlib m=hashlib.md5() m.update('一行白鷺上青天'.encode('utf-8')) #對(duì)密碼加鹽 m.update(password.encode('utf-8'))
六、破解用戶注冊(cè)的密碼
# 重點(diǎn) '''模擬撞庫(kù)破解密碼''' import hashlib passwds=[ #可以通過(guò)random實(shí)現(xiàn)對(duì)passwds中的內(nèi)容 'alex3714', 'alex1313', 'alex94139413', 'alex123456', '123456alex', 'a123lex', ] def make_passwd_dic(passwds): #通過(guò)明文密碼列表,造出與之對(duì)應(yīng)的hash值得字典 dic={} for passwd in passwds: m=hashlib.md5() #使用md5算法,造了一個(gè)工廠 m.update(passwd.encode('utf-8')) #給工廠運(yùn)送原材料(即我們要加密的內(nèi)容) dic[passwd]=m.hexdigest() #產(chǎn)出hash值(即最終的產(chǎn)品),將其加入到我們事先造好的空字典中,字典形式:{密碼:hash值} return dic def break_code(cryptograph,passwd_dic): #判斷攔截的hash值是否與字典中事先造好的hash值相等,相等則說(shuō)明成功進(jìn)行破解 for k,v in passwd_dic.items(): if v == cryptograph: print('密碼是===>\033[46m%s\033[0m' %k) cryptograph='aee949757a2e698417463d47acac93df' #我們攔截拿到的密碼,經(jīng)過(guò)加密的hash值 break_code(cryptograph,make_passwd_dic(passwds)) #將要破解的密碼hash值,和事先造好的hash的字典當(dāng)做函數(shù)的實(shí)參傳給對(duì)應(yīng)的形參
七、hmac模塊的加密方式,與hashlib類似
'''python 還有一個(gè) hmac 模塊,它內(nèi)部對(duì)我們創(chuàng)建 key 和 內(nèi)容 進(jìn)行進(jìn)一步的處理然后再加密:''' import hmac h = hmac.new('天王蓋地虎'.encode('utf8')) #hmac必須要加鹽 h.update('hello'.encode('utf8')) print(h.hexdigest()) #1abaae8f65f68f2695a8545c5bc8e738 #要想保證hmac最終結(jié)果一致,必須保證: #1:hmac.new括號(hào)內(nèi)指定的初始key一樣 #2:無(wú)論update多少次,校驗(yàn)的內(nèi)容累加到一起是一樣的內(nèi)容 # 下面單重方式得到的結(jié)果是一樣的 import hmac h1=hmac.new(b'tom') #初始值必須保證一致,最終得到的結(jié)果就會(huì)不一樣 h1.update(b'hello') h1.update(b'world') print(h1.hexdigest()) h2=hmac.new(b'tom') #初始值必須保證一致,最終得到的結(jié)果就會(huì)不一樣 h2.update(b'helloworld') print(h2.hexdigest()) h3=hmac.new(b'tomhelloworld') #初始值不一樣,所以與上面兩種的結(jié)果不一樣 print(h3.hexdigest()) ''' 0426ccec3b134e8c18fdcefee841ef25 0426ccec3b134e8c18fdcefee841ef25 ff1214d895bbaf5f1847db4ebae8212e '''
到此這篇關(guān)于Python算法模塊之hashlib模塊詳解的文章就介紹到這了,更多相關(guān)Python的hashlib模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)簡(jiǎn)易版的Web服務(wù)器(推薦)
這篇文章主要介紹了Python實(shí)現(xiàn)簡(jiǎn)易Web服務(wù)器的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-01-01使用Python將數(shù)組的元素導(dǎo)出到變量中(unpacking)
最近工作中遇到一個(gè)問(wèn)題,需要利用Python將數(shù)組(list)或元組(tuple)中的元素導(dǎo)出到N個(gè)變量中,現(xiàn)在將我實(shí)現(xiàn)的方法分享給大家,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。2016-10-10Swin?Transformer模塊集成到Y(jié)OLOv5目標(biāo)檢測(cè)算法中實(shí)現(xiàn)
這篇文章主要為大家介紹了Swin?Transformer模塊集成到Y(jié)OLOv5目標(biāo)檢測(cè)算法中實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04利用Python?實(shí)現(xiàn)分布式計(jì)算
這篇文章主要介紹了利用Python?實(shí)現(xiàn)分布式計(jì)算,文章通過(guò)借助于?Ray展開(kāi)對(duì)分布式計(jì)算的實(shí)現(xiàn),感興趣的小伙伴可以參考一下2022-05-05Django掃碼抽獎(jiǎng)平臺(tái)的配置過(guò)程詳解
這篇文章主要介紹了Django掃碼抽獎(jiǎng)平臺(tái),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01Django框架視圖函數(shù)設(shè)計(jì)示例
這篇文章主要介紹了Django框架視圖函數(shù)設(shè)計(jì),結(jié)合實(shí)例形式分析了Django框架視圖函數(shù)處理流程、原理與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-07-07python正則表達(dá)式修復(fù)網(wǎng)站文章字體不統(tǒng)一的解決方法
python正則表達(dá)式修復(fù)網(wǎng)站文章字體不統(tǒng)一的解決方法,需要的朋友可以參考一下2013-02-02人工智能學(xué)習(xí)pyTorch的ResNet殘差模塊示例詳解
這篇文章主要為大家介紹了人工智能學(xué)習(xí)pyTorch的ResNet殘差模塊示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11