Python?hashlib模塊詳細(xì)講解使用方法
1.hashlib的簡介
hashlib 是一個(gè)提供了一些流行的hash(摘要)算法的Python標(biāo)準(zhǔn)庫.其中所包括的算法有 md5, sha1, sha224, sha256, sha384, sha512等
什么是摘要算法呢?摘要算法又稱哈希算法、散列算法。它通過一個(gè)函數(shù),把任意長度的數(shù)據(jù)轉(zhuǎn)換為一個(gè)長度固定的數(shù)據(jù)串(通常用16進(jìn)制的字符串表示)。更多請(qǐng)看:hashlib — 安全哈希與消息摘要
2.hashlib的使用
本文以hashlib中MD5算法為例,其他的sha224、sha256算法用法和MD5基本一致。
1. 常用屬性
hashlib.algorithms #列出所有加密算法 h.digest_size #產(chǎn)生的散列字節(jié)大小。 h.block_size #哈希內(nèi)部塊的大小
2. 常用方法
hash.new([arg]) # 創(chuàng)建指定加密模式的hash對(duì)象 hash.update(arg) # 更新哈希對(duì)象以字符串參數(shù)。如果同一個(gè)hash對(duì)象重復(fù)調(diào)用該方法,m.update(a); m.update(b) 等價(jià)于 m.update(a+b) hash.digest() # 返回摘要,作為二進(jìn)制數(shù)據(jù)字符串值。 hash.hexdigest() # 返回摘要,作為十六進(jìn)制數(shù)據(jù)字符串值 hash.copy() # 復(fù)制
3. 使用示例
# MD5 的使用 #其它的sha1,sha256就是加密函數(shù)不一樣,其余基本相同,這里就不演示了 import hashlib def jm_md5(password): m = hashlib.md5() # 構(gòu)建MD5對(duì)象 m.update(password.encode(encoding='utf-8')) #設(shè)置編碼格式 并將字符串添加到MD5對(duì)象中 password_md5 = m.hexdigest() # hexdigest()將加密字符串 生成十六進(jìn)制數(shù)據(jù)字符串值 return password, password_md5 g = jm_md5('123456') print(g)
#結(jié)果輸出:
('123456', 'e10adc3949ba59abbe56e057f20f883e')
3.hashlib的特點(diǎn)
- 摘要算法在很多地方都有廣泛的應(yīng)用。
- 要注意摘要算法不是加密算法,不能用于加密(因?yàn)闊o法通過摘要反推明文),只能用于防篡改。
- 它的單向計(jì)算特性決定了可以在不存儲(chǔ)明文口令的情況下驗(yàn)證用戶口令。
一個(gè)優(yōu)秀的 hash 算法,將能實(shí)現(xiàn):
- 正向快速:給定明文和 hash 算法,在有限時(shí)間和有限資源內(nèi)能計(jì)算出 hash 值。
- 逆向困難:給定(若干) hash 值,在有限時(shí)間內(nèi)很難(基本不可能)逆推出明文。
- 輸入敏感:原始輸入信息修改一點(diǎn)信息,產(chǎn)生的 hash 值看起來應(yīng)該都有很大不同。
- 沖突避免:很難找到兩段內(nèi)容不同的明文,使得它們的 hash 值一致(發(fā)生沖突)。即對(duì)于任意兩個(gè)不同的數(shù)據(jù)塊,其hash值相同的可能性極??;對(duì)于一個(gè)給定的數(shù)據(jù)塊,找到和它hash值相同的數(shù)據(jù)塊極為困難。
4.實(shí)際演示
1. 基本演示
import hashlib # 一、在構(gòu)建對(duì)象直接插入加密字符串 m1 = hashlib.md5('hello python'.encode(encoding='utf-8')) # 構(gòu)建MD5對(duì)象 print(m1.hexdigest()) # 結(jié)果為: e53024684c9be1dd3f6114ecc8bbdddc # 二、通過update方法 往MD5對(duì)象中增加字符串參數(shù) m2 = hashlib.md5() # 構(gòu)建MD5對(duì)象 m2.update('hello python'.encode(encoding='utf-8')) # 設(shè)置編碼格式 并將字符串添加到MD5對(duì)象中 password_md5 = m2.hexdigest() print(m2.hexdigest()) # 結(jié)果為 e53024684c9be1dd3f6114ecc8bbdddc # 三、當(dāng)數(shù)據(jù)量過過大時(shí),可以分塊摘要,例如: m3 = hashlib.md5() m3.update("hello ".encode("utf-8")) # 注意:分塊是空格也要保持一致 m3.update("python".encode("utf-8")) print(m3.hexdigest()) # 結(jié)果為:e53024684c9be1dd3f6114ecc8bbdddc # MD5是最常見的摘要算法,速度很快,生成結(jié)果是固定的128 bit字節(jié),通常用一個(gè)32位的16進(jìn)制字符串表示。
三種方式,往構(gòu)造的MD5對(duì)象中傳參,只要傳參的字符串一致,最后生成的結(jié)果是一樣的。
這說明hash算法就像一座工廠,工廠接收你送來的原材料(可以用m.update()為工廠運(yùn)送原材料),經(jīng)過加工返回的產(chǎn)品就是hash值。這也是摘要算法的一個(gè)特點(diǎn),它不是加密算法,不能用于加密(因?yàn)闊o法通過摘要反推明文),只能用于防篡改。
2. 應(yīng)用場景案例
hashlib模塊主要應(yīng)用于,用戶賬號(hào)密碼登錄,對(duì)明文密碼進(jìn)行加密等
''' 學(xué)習(xí)中遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流群:711312441 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' import hashlib USER_LIST = [] def pwd_Md5(password): password = password+'hello python' # 字符串混淆加鹽,可以設(shè)置更復(fù)雜一點(diǎn) return hashlib.md5(password.encode("utf-8")).hexdigest() def register(): print('**************用戶注冊(cè)**************') while True: user = input('請(qǐng)輸入用戶名:') if user.isalpha(): break while True: password1 = input('請(qǐng)輸入密碼>>>:').strip() passwprd2 = input('請(qǐng)重復(fù)密碼>>>:').strip() if password1 == passwprd2: password = pwd_Md5(password1) # 將密碼進(jìn)行Md5加密 break else: print('密碼不正確,重新輸入!') temp = {'username':user,'password':password} 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'] == pwd_Md5(pwd): return True if __name__=='__main__': register() if login(): print('登陸成功') else: print('登陸失敗')
#結(jié)果輸出:
**************用戶注冊(cè)**************
請(qǐng)輸入用戶名:lizexiong
請(qǐng)輸入密碼>>>:123456
請(qǐng)重復(fù)密碼>>>:123456
**************用戶登陸**************
請(qǐng)輸入用戶名:lizexiong
請(qǐng)輸入密碼:123456
登陸成功
用戶登錄需要使用密碼,密碼一定要加密,保證用戶的信息安全。
- 加密可以使用hashlib模塊進(jìn)行加密。
- 加密可以寫成加密函數(shù),方便多處調(diào)用
- 提高密碼解密的復(fù)雜性,代碼中多加字符串。(加密算法雖然依然非常厲害,但是也存在缺陷,即:通過撞庫可以反解。所以,有必要對(duì)加密密碼進(jìn)行加鹽。)
到此這篇關(guān)于Python hashlib模塊詳細(xì)講解使用方法的文章就介紹到這了,更多相關(guān)Python hashlib模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
OpenCV HSV顏色識(shí)別及HSV基本顏色分量范圍
這篇文章主要介紹了OpenCV HSV顏色識(shí)別及HSV基本顏色分量范圍,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03Python實(shí)現(xiàn)視頻字幕時(shí)間軸格式轉(zhuǎn)換的示例
本文主要介紹了Python實(shí)現(xiàn)視頻字幕時(shí)間軸格式轉(zhuǎn)換的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11Python調(diào)用接口合并Excel表代碼實(shí)例
這篇文章主要介紹了Python調(diào)用接口合并Excel表代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03pandas 缺失值與空值處理的實(shí)現(xiàn)方法
這篇文章主要介紹了pandas 缺失值與空值處理的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10