Python中hashlib模塊的摘要算法詳解
hashlib 模塊
Python的hashlib提供了常見的摘要算法,如MD5,SHA1等等。
什么是摘要算法呢?
摘要算法又稱哈希算法、散列算法。它通過一個(gè)函數(shù),把任意長度的數(shù)據(jù)轉(zhuǎn)換為一個(gè)長度固定的數(shù)據(jù)串(通常用16進(jìn)制的字符串表示)。
摘要算法之所以能指出數(shù)據(jù)是否被篡改過,就是因?yàn)檎瘮?shù)是一個(gè)單向函數(shù),計(jì)算 f(data) 很容易,但通過 digest 反推 data 卻非常困難。
而且,對原始數(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對象 hash.update(arg) # 更新哈希對象以字符串參數(shù)。如果同一個(gè)hash對象重復(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ā)生沖突)。即對于任意兩個(gè)不同的數(shù)據(jù)塊,其hash值相同的可能性極??;對于一個(gè)給定的數(shù)據(jù)塊,找到和它hash值相同的數(shù)據(jù)塊極為困難。
除了上面,我們列舉的幾個(gè),庫里還有這些加密方式:
- sha224()
- sha256()
- sha384()
- sha512()
- blake2b()
- blake2s()
- sha3_224
- sha3_256
- sha3_384
- sha3_512
- shake_128
- shake_256
- 等等
主要的應(yīng)用場景呢,就是我們的密碼的加密和明文的加密,按照一定的約定去形成我們的加密的方式即可,有些時(shí)候?yàn)榱吮苊馓^于簡單的加密,我們會(huì)約定一個(gè)私鑰,增加加密的復(fù)雜性。
在自動(dòng)化中,我還會(huì)用這個(gè)產(chǎn)生不一樣的文件的名稱,這樣可以方便在自動(dòng)化的過程中有區(qū)分。
到此這篇關(guān)于Python中hashlib模塊的摘要算法詳解的文章就介紹到這了,更多相關(guān)Python的hashlib模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python pandas如何根據(jù)指定條件篩選數(shù)據(jù)
這篇文章主要介紹了Python pandas如何根據(jù)指定條件篩選數(shù)據(jù)問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02Python自動(dòng)化之實(shí)現(xiàn)桌面壁紙下載器
隨著計(jì)算機(jī)性能的提升,人們對計(jì)算機(jī)個(gè)性化的要求也越來越高了,自己使用的計(jì)算機(jī)當(dāng)然要設(shè)置成自己喜歡的風(fēng)格!本文就來用Python做個(gè)桌面壁紙下載器,需要的可以參考一下2022-11-11對django的User模型和四種擴(kuò)展/重寫方法小結(jié)
今天小編就為大家分享一篇對django的User模型和四種擴(kuò)展/重寫方法小結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08