Python基礎(chǔ)之hashlib模塊詳解
一、hashlib簡(jiǎn)介
1.什么叫hash:
hash是一種算法(不同的hash算法只是復(fù)雜度不一樣)(3.x里代替了md5模塊和sha模塊,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法),該算法接受傳入的內(nèi)容,經(jīng)過運(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算法不變,無論校驗(yàn)的內(nèi)容有多大,得到的hash值長(zhǎng)度是固定的(如從網(wǎng)上下載文件要進(jìn)行hash校驗(yàn),保證網(wǎng)絡(luò)傳輸沒有丟包)
MD5是最常見的摘要算法,速度很快,生成結(jié)果是固定的16字節(jié),通常用一個(gè)32位的16進(jìn)制字符串表示。SHA1算法更安全點(diǎn),它的結(jié)果是20字節(jié)長(zhǎng)度,通常用一個(gè)40位的16進(jìn)制字符串表示。而比SHA1更安全的算法是SHA256和SHA512等等,不過越安全的算法越慢,并且摘要長(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方法類似,不過返回的是兩倍長(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è)算法的字符串名稱,data是可選的bytes類型待摘要的數(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 hashlib
obj = hashlib.md5() #構(gòu)造一個(gè)hashlib的對(duì)象
obj.update("小馬過河") #update對(duì)指定字符串進(jìn)行加密
print(obj)
--------------結(jié)果:
obj.update("小馬過河")
TypeError: Unicode-objects must be encoded before hashing
2)obj是hash對(duì)象
import hashlib
obj = hashlib.md5()
obj.update("小馬過河".encode("utf-8"))
print(obj,type(obj))
-------------------結(jié)果:
<md5 HASH object @ 0x001C5590> <class '_hashlib.HASH'>
3)得到字符串
import hashlib
obj = hashlib.md5()
obj.update("小馬過河".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("小馬過河".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
四、小小案例
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)輸入用戶名:小馬過河
請(qǐng)輸入密碼:123456
請(qǐng)輸入用戶名:N
**************用戶登陸**************
請(qǐng)輸入用戶名:小馬過河
請(qǐng)輸入密碼:123456
登陸成功
到此這篇關(guān)于Python基礎(chǔ)之hashlib模塊詳解的文章就介紹到這了,更多相關(guān)Python hashlib模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Keras在訓(xùn)練期間可視化訓(xùn)練誤差和測(cè)試誤差實(shí)例
這篇文章主要介紹了Keras在訓(xùn)練期間可視化訓(xùn)練誤差和測(cè)試誤差實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06
Python實(shí)現(xiàn)自定義順序、排列寫入數(shù)據(jù)到Excel的方法
這篇文章主要介紹了Python實(shí)現(xiàn)自定義順序、排列寫入數(shù)據(jù)到Excel的方法,涉及Python針對(duì)Excel文件的數(shù)據(jù)處理及讀寫相關(guān)操作技巧,需要的朋友可以參考下2018-04-04
python如何寫入dbf文件內(nèi)容及創(chuàng)建dbf文件
這篇文章主要介紹了python如何寫入dbf文件內(nèi)容及創(chuàng)建dbf文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
解決pandas無法在pycharm中使用plot()方法顯示圖像的問題
今天小編就為大家分享一篇解決pandas無法在pycharm中使用plot()方法顯示圖像的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05
python驗(yàn)證碼識(shí)別教程之滑動(dòng)驗(yàn)證碼
這篇文章主要給大家介紹了關(guān)于python驗(yàn)證碼識(shí)別教程之滑動(dòng)驗(yàn)證碼的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06
python3+opencv生成不規(guī)則黑白mask實(shí)例
今天小編就為大家分享一篇python3+opencv生成不規(guī)則黑白mask實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02
pytorch如何使用訓(xùn)練好的模型預(yù)測(cè)新數(shù)據(jù)
這篇文章主要介紹了pytorch如何使用訓(xùn)練好的模型預(yù)測(cè)新數(shù)據(jù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
python中正則表達(dá)式findall的用法實(shí)例
在寫著自動(dòng)化測(cè)試的腳本時(shí)重新復(fù)習(xí)了一下正則表達(dá)式findall()方法,下面這篇文章主要給大家介紹了關(guān)于python中正則表達(dá)式findall用法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
Python實(shí)現(xiàn)合并帶有嵌入圖片的單元格
這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)合并帶有嵌入圖片的單元格,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-12-12
python用opencv將標(biāo)注提取畫框到對(duì)應(yīng)的圖像中
這篇文章主要介紹了python用opencv將標(biāo)注提取畫框到對(duì)應(yīng)的圖像中,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08

