Python基礎之hashlib模塊詳解
一、hashlib簡介
1.什么叫hash:
hash是一種算法(不同的hash算法只是復雜度不一樣)(3.x里代替了md5模塊和sha模塊,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法),該算法接受傳入的內容,經(jīng)過運算得到一串hash值
2.hash值的特點是(hash值/產(chǎn)品有三大特性:):
- 只要傳入的內容一樣,得到的hash值必然一樣=====>要用明文傳輸密碼文件完整性校驗
- 不能由hash值返解成內容=======》把密碼做成hash值,不應該在網(wǎng)絡傳輸明文密碼(只能有內容返回hash值)
- 只要使用的hash算法不變,無論校驗的內容有多大,得到的hash值長度是固定的(如從網(wǎng)上下載文件要進行hash校驗,保證網(wǎng)絡傳輸沒有丟包)
MD5
是最常見的摘要算法,速度很快,生成結果是固定的16字節(jié),通常用一個32位的16進制字符串表示。SHA1算法更安全點,它的結果是20字節(jié)長度,通常用一個40位的16進制字符串表示。而比SHA1更安全的算法是SHA256和SHA512等等,不過越安全的算法越慢,并且摘要長度更長
二、hash對象的方法
hash.update(arg) 更新hash對象。連續(xù)的調用該方法相當于連續(xù)的追加更新。例如m.update(a); m.update(b)相當于m.update(a+b)。注意,當數(shù)據(jù)規(guī)模較大的時候,Python的GIL在此時會解鎖,用于提高計算速度。 一定要理解update()的作用,由于消息摘要是只針對當前狀態(tài)產(chǎn)生的,所以每一次update后,再次計算hexdigest()的值都會不一樣。 hash.digest() 返回bytes格式的消息摘要 hash.hexdigest() 與digest方法類似,不過返回的是兩倍長度的字符串對象,所有的字符都是十六進制的數(shù)字。通常用于郵件傳輸或非二進制環(huán)境中。通常我們比較摘要時,比較的就是這個值! hash.copy() 返回一個hash對象的拷貝 hashlib.new(name[, data]) 一個通用的構造方法,name是某個算法的字符串名稱,data是可選的bytes類型待摘要的數(shù)據(jù)。 >>> h = hashlib.new('sha256',b"haha") >>> h.hexdigest() '090b235e9eb8f197f2dd927937222c570396d971222d9009a9189e2b6cc0a2c1'
三、hashlib實際操作
1)在進行md5哈希運算前,需要對數(shù)據(jù)進行編碼,否則報錯
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做成加密函數(shù)(添加基礎的字符了的)
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 登陸成功
到此這篇關于Python基礎之hashlib模塊詳解的文章就介紹到這了,更多相關Python hashlib模塊內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python streamlit構建令人驚嘆的可視化Web高級主題界面
本文將深入探討Streamlit的方方面面,從基礎使用到高級主題,從數(shù)據(jù)可視化到部署與分享,更涵蓋了性能優(yōu)化、安全性考慮等最佳實踐,通過豐富的示例代碼和詳細解釋,將能夠全面了解Streamlit的強大功能,并在構建數(shù)據(jù)驅動應用時游刃有余2024-01-01Python使用cx_Oracle模塊操作Oracle數(shù)據(jù)庫詳解
這篇文章主要介紹了Python使用cx_Oracle模塊操作Oracle數(shù)據(jù)庫,結合實例形式較為詳細的分析了cx_Oracle模塊的下載、安裝及針對Oracle數(shù)據(jù)庫的連接、執(zhí)行SQL語句、存儲過程等相關操作技巧,需要的朋友可以參考下2018-05-05