Python中hashlib模塊的摘要算法詳解
hashlib 模塊
Python的hashlib提供了常見的摘要算法,如MD5,SHA1等等。
什么是摘要算法呢?
摘要算法又稱哈希算法、散列算法。它通過一個(gè)函數(shù),把任意長(zhǎng)度的數(shù)據(jù)轉(zhuǎn)換為一個(gè)長(zhǎng)度固定的數(shù)據(jù)串(通常用16進(jìn)制的字符串表示)。
摘要算法之所以能指出數(shù)據(jù)是否被篡改過,就是因?yàn)檎瘮?shù)是一個(gè)單向函數(shù),計(jì)算 f(data) 很容易,但通過 digest 反推 data 卻非常困難。
而且,對(duì)原始數(shù)據(jù)做一個(gè)bit的修改,都會(huì)導(dǎo)致計(jì)算出的摘要完全不同。
示例
我們以常見的摘要算法MD5為例,計(jì)算出一個(gè)字符串的MD5值:
import hashlib
md5 = hashlib.md5()
md5.update('my name is leizi'.encode('utf-8'))
print(md5.hexdigest())那么計(jì)算出來的md5就是
d7d8c24cddfb4c15b83db713badda3d3
如果數(shù)據(jù)量很大,可以分塊多次調(diào)用 update() ,最后計(jì)算的結(jié)果是一樣的:
import hashlib
md5 = hashlib.md5()
md5.update('my name is leizi'.encode('utf-8'))
md5.update(" 歡迎關(guān)注傷心的辣條".encode('utf-8'))
print(md5.hexdigest())最后的結(jié)果
96f4063331ea2c477fb3d7e980d73404
試試改動(dòng)一個(gè)字母,看看計(jì)算的結(jié)果是否完全不同。
import hashlib
md5 = hashlib.md5()
md5.update('my name is leizi1'.encode('utf-8'))
md5.update(" 歡迎關(guān)注傷心的辣條 ".encode('utf-8'))
print(md5.hexdigest())結(jié)果打印
57488933f9d74f5404533d111cbbf4e4
MD5是最常見的摘要算法,速度很快,生成結(jié)果是固定的128 bit/16字節(jié),通常用一個(gè)32位的16進(jìn)制字符串表示。
另一種常見的摘要算法是SHA1,調(diào)用SHA1和調(diào)用MD5完全類似:
import hashlib
sha1 = hashlib.sha1()
sha1.update('my name is leizi '.encode('utf-8'))
sha1.update('歡迎關(guān)注傷心的辣條'.encode('utf-8'))
print(sha1.hexdigest())結(jié)果:
abbe3ae3d30736838602e9d119a2dfe016577a07
常用的屬性
hashlib.algorithms #列出所有加密算法 h.digest_size #產(chǎn)生的散列字節(jié)大小。 h.block_size #哈希內(nèi)部塊的大小
常用方法
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ù)制
hashlib的特點(diǎn)
1、摘要算法在很多地方都有廣泛的應(yīng)用。
2、要注意摘要算法不是加密算法,不能用于加密(因?yàn)闊o法通過摘要反推明文),只能用于防篡改。
3、它的單向計(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ù)塊極為困難。
除了上面,我們列舉的幾個(gè),庫(kù)里還有這些加密方式:
- sha224()
- sha256()
- sha384()
- sha512()
- blake2b()
- blake2s()
- sha3_224
- sha3_256
- sha3_384
- sha3_512
- shake_128
- shake_256
- 等等
主要的應(yīng)用場(chǎng)景呢,就是我們的密碼的加密和明文的加密,按照一定的約定去形成我們的加密的方式即可,有些時(shí)候?yàn)榱吮苊馓^于簡(jiǎn)單的加密,我們會(huì)約定一個(gè)私鑰,增加加密的復(fù)雜性。
在自動(dòng)化中,我還會(huì)用這個(gè)產(chǎn)生不一樣的文件的名稱,這樣可以方便在自動(dòng)化的過程中有區(qū)分。
到此這篇關(guān)于Python中hashlib模塊的摘要算法詳解的文章就介紹到這了,更多相關(guān)Python的hashlib模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
實(shí)例講解python中的序列化知識(shí)點(diǎn)
本篇文章通過代碼實(shí)例給大家詳細(xì)分享了關(guān)于python中的序列化知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2018-10-10
Pycharm中出現(xiàn)ImportError:DLL load failed:找不到指定模塊的解決方法
這篇文章主要介紹了Pycharm中出現(xiàn)ImportError:DLL load failed:找不到指定模塊的解決方法,需要的朋友可以參考下2019-09-09
python庫(kù)lxml在linux和WIN系統(tǒng)下的安裝
這篇內(nèi)容我們給大家分享了lxml在WIN和LINUX系統(tǒng)下的簡(jiǎn)單快速安裝過程,有興趣的朋友參考學(xué)習(xí)下。2018-06-06
python 監(jiān)控logcat關(guān)鍵字功能
這篇文章主要介紹了python 監(jiān)控logcat關(guān)鍵字功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
解決Pytorch半精度浮點(diǎn)型網(wǎng)絡(luò)訓(xùn)練的問題
這篇文章主要介紹了解決Pytorch半精度浮點(diǎn)型網(wǎng)絡(luò)訓(xùn)練的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05
python用sqlacodegen根據(jù)已有數(shù)據(jù)庫(kù)(表)結(jié)構(gòu)生成對(duì)應(yīng)SQLAlchemy模型
本文介紹了如何使用sqlacodegen獲取數(shù)據(jù)庫(kù)所有表的模型類,然后使用ORM技術(shù)進(jìn)行CRUD操作,有此需求的朋友可以了解下本文2021-06-06
使用spyder3調(diào)試python程序的實(shí)現(xiàn)步驟
本文主要介紹了使用spyder3調(diào)試python程序的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
Python中一個(gè)for循環(huán)循環(huán)多個(gè)變量的示例
今天小編就為大家分享一篇Python中一個(gè)for循環(huán)循環(huán)多個(gè)變量的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07
Python統(tǒng)計(jì)不同整數(shù)的出現(xiàn)次數(shù)的三種方法

