Python基礎(chǔ)之hashlib模塊詳解
1.什么叫hash:
hash是一種算法(不同的hash算法只是復(fù)雜度不一樣)(3.x里代替了md5模塊和sha模塊,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法),該算法接受傳入的內(nèi)容,經(jīng)過(guò)運(yùn)算得到一串hash值
2.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)有丟包)MD5是最常見(jiàn)的摘要算法,速度很快,生成結(jié)果是固定的16字節(jié),通常用一個(gè)32位的16進(jìn)制字符串表示。SHA1算法更安全點(diǎn),它的結(jié)果是20字節(jié)長(zhǎng)度,通常用一個(gè)40位的16進(jìn)制字符串表示。而比SHA1更安全的算法是SHA256和SHA512等等,不過(guò)越安全的算法越慢,并且摘要長(zhǎng)度更長(zhǎng)
二、hash對(duì)象的方法hash.update(arg)更新hash對(duì)象。連續(xù)的調(diào)用該方法相當(dāng)于連續(xù)的追加更新。例如m.update(a); m.update(b)相當(dāng)于m.update(a+b)。注意,當(dāng)數(shù)據(jù)規(guī)模較大的時(shí)候,Python的GIL在此時(shí)會(huì)解鎖,用于提高計(jì)算速度。一定要理解update()的作用,由于消息摘要是只針對(duì)當(dāng)前狀態(tài)產(chǎn)生的,所以每一次update后,再次計(jì)算hexdigest()的值都會(huì)不一樣。 hash.digest()返回bytes格式的消息摘要 hash.hexdigest()與digest方法類(lèi)似,不過(guò)返回的是兩倍長(zhǎng)度的字符串對(duì)象,所有的字符都是十六進(jìn)制的數(shù)字。通常用于郵件傳輸或非二進(jìn)制環(huán)境中。通常我們比較摘要時(shí),比較的就是這個(gè)值! hash.copy()返回一個(gè)hash對(duì)象的拷貝hashlib.new(name[, data])一個(gè)通用的構(gòu)造方法,name是某個(gè)算法的字符串名稱(chēng),data是可選的bytes類(lèi)型待摘要的數(shù)據(jù)。>>> h = hashlib.new(’sha256’,b'haha')>>> h.hexdigest()’090b235e9eb8f197f2dd927937222c570396d971222d9009a9189e2b6cc0a2c1’三、hashlib實(shí)際操作
1)在進(jìn)行md5哈希運(yùn)算前,需要對(duì)數(shù)據(jù)進(jìn)行編碼,否則報(bào)錯(cuò)
import hashlibobj = 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 hashlibobj = hashlib.md5()obj.update('小馬過(guò)河'.encode('utf-8'))print(obj,type(obj))-------------------結(jié)果:<md5 HASH object @ 0x001C5590> <class ’_hashlib.HASH’>
3)得到字符串
import hashlibobj = hashlib.md5()obj.update('小馬過(guò)河'.encode('utf-8'))result=obj.hexdigest()print(result)--------------結(jié)果:24f67b0f6d02adc8867d612e0e0fc40a
4)給加密增添難度
import hashlibobj = 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 hashlibdef get_md5(data): #傳參為需要加密的字符串 obj = hashlib.md5('sidrsicxwersdfsaersdfsdfresdy54436jgfdsjdxff123ad'.encode(’utf-8’)) obj.update(data.encode(’utf-8’)) result = obj.hexdigest() return resultval = get_md5(’123’)print(val)--------------結(jié)果:35093270b6352fa9721370b781f7b4d7四、小小案例
import hashlibUSER_LIST = []def get_md5(data): obj = hashlib.md5('12:;idrsicxwersdfsaersdfsdfresdy54436jgfdsjdxff123ad'.encode(’utf-8’)) obj.update(data.encode(’utf-8’)) result = obj.hexdigest() return resultdef register(): print(’**************用戶(hù)注冊(cè)**************’) while True:user = input(’請(qǐng)輸入用戶(hù)名:’)if user == ’N’: returnpwd = input(’請(qǐng)輸入密碼:’)temp = {’username’:user,’password’:get_md5(pwd)}USER_LIST.append(temp)def login(): print(’**************用戶(hù)登陸**************’) user = input(’請(qǐng)輸入用戶(hù)名:’) pwd = input(’請(qǐng)輸入密碼:’) for item in USER_LIST:if item[’username’] == user and item[’password’] == get_md5(pwd): return Trueregister()result = login()if result: print(’登陸成功’)else: print(’登陸失敗’)------------------------結(jié)果:**************用戶(hù)注冊(cè)**************請(qǐng)輸入用戶(hù)名:小馬過(guò)河請(qǐng)輸入密碼:123456請(qǐng)輸入用戶(hù)名:N**************用戶(hù)登陸**************請(qǐng)輸入用戶(hù)名:小馬過(guò)河請(qǐng)輸入密碼:123456登陸成功
到此這篇關(guān)于Python基礎(chǔ)之hashlib模塊詳解的文章就介紹到這了,更多相關(guān)Python hashlib模塊內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. ASP新手必備的基礎(chǔ)知識(shí)2. PHP基礎(chǔ)之生成器4——比較生成器和迭代器對(duì)象3. CentOS郵箱服務(wù)器搭建系列——SMTP服務(wù)器的構(gòu)建( Postfix )4. asp文件用什么軟件編輯5. JAVA 實(shí)現(xiàn)延遲隊(duì)列的方法6. Vue axios獲取token臨時(shí)令牌封裝案例7. js實(shí)現(xiàn)計(jì)算器功能8. JS中6個(gè)對(duì)象數(shù)組去重的方法9. 利用CSS制作3D動(dòng)畫(huà)10. 通過(guò)IEAD+Maven快速搭建SSM項(xiàng)目的過(guò)程(Spring + Spring MVC + Mybatis)

網(wǎng)公網(wǎng)安備