Python常用內(nèi)建模塊hashlib、hmac詳解
一、摘要算法簡(jiǎn)介(hashlib)
python的hashlib模塊針對(duì)不同的安全哈希和消息摘要算法實(shí)現(xiàn)了一個(gè)通用的接口。
包括: FIPS 的 SHA1, SHA224, SHA256, SHA384, and SHA512 (定義于 FIPS 180-2) 算法,以及 RSA 的 MD5 算法。
1、哈希算法
每種類型的hash都有一個(gè)構(gòu)造方法,都會(huì)返回一個(gè)具有相同的簡(jiǎn)單接口的hash對(duì)象。
例如,使用 use sha256() 創(chuàng)建一個(gè) SHA-256 hash 對(duì)象。
你可以使用 update() 方法向這個(gè)對(duì)象輸入字節(jié)類對(duì)象。
在任何時(shí)候你都可以使用 digest() 或 hexdigest() 方法獲得到目前為止輸入這個(gè)對(duì)象的拼接數(shù)據(jù)的 digest。
哈?;谧止?jié),所以u(píng)pdata()不支持輸入字符串對(duì)象。
更簡(jiǎn)要的寫法:
2、屬性方法
hash.digest_size
以字節(jié)表示的結(jié)果哈希對(duì)象的大小。
hash.block_size
以字節(jié)表示的哈希算法的內(nèi)部塊大小。
hash.update (data)
用 bytes-like object 來(lái)更新哈希對(duì)象。 重復(fù)調(diào)用相當(dāng)于單次調(diào)用并傳入所有參數(shù)的拼接結(jié)果: m.update(a); m.update(b) 等價(jià)于 m.update(a+b) 。
注意:為了更好的多線程性能,在對(duì)象創(chuàng)建或者更新時(shí),若數(shù)據(jù)大于2047字節(jié)則 Python 的 GIL 會(huì)被釋放。
hash.digest()
返回當(dāng)前已傳給updata()方法的數(shù)據(jù)摘要。這是一個(gè)大小為digest_size的字節(jié)串對(duì)象,字節(jié)串中可包含0-255的完整取值范圍。
hash.hexdigest()
類式于digest()但摘要會(huì)以兩倍長(zhǎng)度字符串對(duì)象的形式返回,其中僅包含十六進(jìn)制數(shù)碼。這可以被用于在電子郵件或其他非二進(jìn)制環(huán)境中安全地交換數(shù)據(jù)值,
hash.copy()
返回哈希對(duì)象的副本,這可被用來(lái)高效地計(jì)算共享相同初始子串的數(shù)據(jù)的摘要。
3、shake可變長(zhǎng)度摘要
shake_128()和shake_256()算法提供安全的length_in_bits //2至128或256位可變長(zhǎng)度摘要。
為此,它們的摘要需指定一個(gè)長(zhǎng)度。shake算法不限制最大長(zhǎng)度。
二、摘要算法應(yīng)用
任何允許用戶登錄的網(wǎng)站都會(huì)存儲(chǔ)用戶登錄的用戶名和口令。如何存儲(chǔ)用戶名和口令呢?
方法是存到數(shù)據(jù)庫(kù)表中:
name | password |
michael | 123456 |
bob | abc999 |
alice | alice2008 |
如果以明文保存用戶口令,如果數(shù)據(jù)庫(kù)泄露,所有用戶的口令就落入黑客的手里。
此外,網(wǎng)站運(yùn)維人員是可以訪問(wèn)數(shù)據(jù)庫(kù)的,也就是能獲取到所有用戶的口令。
正確的保存口令的方式是不存儲(chǔ)用戶的明文口令,而是存儲(chǔ)用戶口令的摘要,比如MD5:
name | password |
michael | e10adc3949ba59abbe56e057f20f883e |
bob | 878ef96e86145580c38c87f0410ad153 |
alice | 99b1c2188db85afee403b1536010c2c9 |
當(dāng)用戶登錄時(shí),首先計(jì)算用戶輸入的明文口令的MD5,然后和數(shù)據(jù)庫(kù)存儲(chǔ)的MD5對(duì)比,如果一致,說(shuō)明口令輸入正確,如果不一致,口令肯定錯(cuò)誤。
三、基于秘鑰的消息驗(yàn)證(hmac)
hmac. new (key, msg=None, digestmod='')
返回一個(gè)新的 hmac 對(duì)象。 key 是一個(gè)指定密鑰的 bytes 或 bytearray 對(duì)象。 如果提供了 msg,將會(huì)調(diào)用 update(msg) 方法。
digestmod 為 HMAC 對(duì)象所用的摘要名稱、摘要構(gòu)造器或模塊。
雖然該參數(shù)位置靠后,但它卻是必須的。
1、方法
hmac.update(msg)
用msg來(lái)更新hmac對(duì)象,重復(fù)調(diào)用相當(dāng)于單次調(diào)用并傳入所有參數(shù)的拼接結(jié)果。
hmac.digest()
返回當(dāng)前已傳給 update() 方法的字節(jié)串?dāng)?shù)據(jù)的摘要。 這個(gè)字節(jié)串?dāng)?shù)據(jù)的長(zhǎng)度將與傳給構(gòu)造器的摘要的長(zhǎng)度 digest_size 相同。 它可以包含非 ASCII 的字節(jié),包括 NUL 字節(jié)。
hmac.hexdigest()
類似digest()但摘要會(huì)以兩倍長(zhǎng)度字符串的形式返回,其中僅包含十六進(jìn)制數(shù)碼,這可以被用于在電子郵件或其他非二進(jìn)制環(huán)境中安全地交換數(shù)據(jù)值。
hmac.copy ()
返回 hmac 對(duì)象的副本(“克?。?。 這可被用來(lái)高效地計(jì)算共享相同初始子串的數(shù)據(jù)的摘要。
2、屬性
HMAC. digest_size
以字節(jié)表示的結(jié)果 HMAC 摘要的大小。
HMAC. block_size
以字節(jié)表示的哈希算法的內(nèi)部塊大小。
3、輔助函數(shù)
hmac. compare_digest (a, b)
返回 a == b 。
此函數(shù)使用一種經(jīng)專門設(shè)計(jì)的方式通過(guò)避免基于內(nèi)容的短路行為來(lái)防止定時(shí)分析,使得它適合處理密碼。
a 和 b 必須為相同的類型:或者是 str
到此這篇關(guān)于Python常用內(nèi)建模塊hashlib、hmac詳解的文章就介紹到這了,更多相關(guān)Python的hashlib、hmac模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用python微信庫(kù)itchat實(shí)現(xiàn)微信自動(dòng)回復(fù)功能
最近發(fā)現(xiàn)了一個(gè)特別好玩的Python 微信庫(kù)itchat,可以實(shí)現(xiàn)自動(dòng)回復(fù)等多種功能,下面這篇文章主要給大家介紹了利用python微信庫(kù)itchat實(shí)現(xiàn)微信自動(dòng)回復(fù)功能的相關(guān)資料,需要的朋友可以參考學(xué)習(xí),下面來(lái)一起看看吧。2017-05-05python 使用Tensorflow訓(xùn)練BP神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)鳶尾花分類
這篇文章主要介紹了python 使用Tensorflow訓(xùn)練BP神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)鳶尾花分類,幫助大家更好的利用python進(jìn)行深度學(xué)習(xí),感興趣的朋友可以了解下2021-05-05Python實(shí)現(xiàn)的ini文件操作類分享
這篇文章主要介紹了Python實(shí)現(xiàn)的ini文件操作類分享,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-11-11Python基于TCP實(shí)現(xiàn)會(huì)聊天的小機(jī)器人功能示例
這篇文章主要介紹了Python基于TCP實(shí)現(xiàn)會(huì)聊天的小機(jī)器人功能,結(jié)合實(shí)例形式分析了Python通過(guò)socket模塊實(shí)現(xiàn)TCP連接的客戶端與服務(wù)器端模擬聊天機(jī)器人功能相關(guān)操作技巧,需要的朋友可以參考下2018-04-04python 在threading中如何處理主進(jìn)程和子線程的關(guān)系
這篇文章主要介紹了python 在threading中如何處理主進(jìn)程和子線程的關(guān)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04