Python中的hashlib模塊解析
模塊簡介
1. 這個(gè)模塊針對(duì)許多不同的安全哈希和消息摘要算法實(shí)現(xiàn)了一個(gè)通用接口。
2. 什么是哈希(Hash)? 哈希,是把任意長度的輸入通過散列算法變換成固定長度的輸出,簡單的說就是通過函數(shù),將明文數(shù)據(jù)通過變成密文數(shù)據(jù)達(dá)到加密的作用。
3. 每種類型的 hash 都有一個(gè)構(gòu)造器方法,它們都返回一個(gè)具有相同的簡單接口的 hash 對(duì)象。 例如,使用sha256() 創(chuàng)建一個(gè) SHA-256 hash 對(duì)象。
4. 然后使用 update() 方法向這個(gè)對(duì)象輸入' 字節(jié)類對(duì)象 (通常是 bytes) '。在任何時(shí)候你都可以使用digest() 或 hexdigest() 方法獲得到目前為止輸入這個(gè)對(duì)象的拼接數(shù)據(jù)的 digest。
hashilib 構(gòu)造器
此模塊中常見 hash 算法構(gòu)造器
sha1(), sha224(), sha256(), sha384(), sha512(), blake2b() 和 blake2s()。 md5()
在大部分平臺(tái)上可用的還有
sha3_224(), sha3_256(), sha3_384(), sha3_512(), shake_128(), shake_256() 等等
如果需要獲取構(gòu)造器對(duì)象,我們可以直接引入模塊 hashilib 后用點(diǎn)的方式生成,如下實(shí)例:
代碼示例
import hashlib h = hashlib.md5() print(h)
打印結(jié)果
<md5 _hashlib.HASH object @ 0x00000233D317EAD0>
示例以 md5 為例,在模塊名后用點(diǎn)的方式找到需要的算法構(gòu)造器名稱即可生成算法構(gòu)造器對(duì)象。
hashlib.new() —創(chuàng)建對(duì)象
一個(gè)接受所希望的算法對(duì)應(yīng)的字符串 name 作為第一個(gè)形參的通用構(gòu)造器。
在 new() 括號(hào)中輸入哈希構(gòu)造器算法構(gòu)造器的名稱字符串相當(dāng)于調(diào)用了構(gòu)造器創(chuàng)建了一個(gè)對(duì)象。 此方法和上面寫的用點(diǎn)的方式生成構(gòu)造器對(duì)象結(jié)果是一樣的。
語法格式
hashlib.new(name, [data, ]*, usedforsecurity=True)
代碼示例
import hashlib h = hashlib.new('md5') print(h)
打印結(jié)果
<md5 _hashlib.HASH object @ 0x0000025FC95EEAD0>
hash.digest_size
以字節(jié)表示的結(jié)果哈希對(duì)象的大小。
代碼示例
import hashlib h = hashlib.md5() res1 = h.digest_size print(res1)
打印結(jié)果
16
返回該構(gòu)造器的進(jìn)制大小,md5 為16進(jìn)制。
hash.block_size
以字節(jié)表示的哈希算法的內(nèi)部塊大小。
代碼示例
import hashlib h = hashlib.md5() res1 = h.block_size print(res1)
打印結(jié)果
64
hash.update() —傳入?yún)?shù)
用 byte類型 來更新哈希對(duì)象。
代碼示例一
import hashlib h = hashlib.md5() h.update(b'abcdefg') # 將字節(jié)型對(duì)象傳入哈希對(duì)象 res = h.hexdigest() print(res)
打印結(jié)果
7ac66c0f148de9519b8bd264312c4d64
1. 調(diào)用 md5() 生成哈希對(duì)象,使用方法 update 輸入需要被加密的對(duì)象,需要注意必須為'字節(jié)型數(shù)據(jù)',
2. 如何獲得字節(jié)型對(duì)象?可以使用字符串的內(nèi)置方法 encode() 轉(zhuǎn)化為字節(jié)型?;蛘?,當(dāng)字符串為英文或者純數(shù)字組成,只要在字符串引號(hào)外加上' b '也可以轉(zhuǎn)化成字節(jié)型。
重復(fù)調(diào)用相當(dāng)于單次調(diào)用并傳入所有參數(shù)的拼接結(jié)果: m.update(a); m.update(b) 等價(jià)于 m.update(a+b)
代碼示例二
import hashlib h = hashlib.md5() h.update(b'abcd') # 傳一次 b'abcd' 再傳一次 b'efg' 結(jié)果和傳一次 b'abcdefg'一樣 h.update(b'efg') res = h.hexdigest() print(res)
打印結(jié)果
7ac66c0f148de9519b8bd264312c4d64
結(jié)果和示例一中的值一樣。
hash.digest() —返回字節(jié)串對(duì)象
返回當(dāng)前已傳給 update() 方法的數(shù)據(jù)摘要。 這是一個(gè)大小為 digest_size 的字節(jié)串對(duì)象。
也就是說返回被加密后的字節(jié)串對(duì)象。
代碼示例
import hashlib h = hashlib.md5() h.update(b'abcdefg') res = h.digest() print(res)
打印結(jié)果
b'z\xc6l\x0f\x14\x8d\xe9Q\x9b\x8b\xd2d1,Md'
hash.hexdigest() —返回字符串對(duì)象
類似于 digest() 但摘要會(huì)以兩倍長度字符串對(duì)象的形式返回,其中僅包含十六進(jìn)制數(shù)碼。 這可以被用于在電子郵件或其他非二進(jìn)制環(huán)境中安全地交換數(shù)據(jù)值。
代碼示例
import hashlib h = hashlib.md5() h.update(b'abcdefg') res = h.hexdigest() print(res)
打印結(jié)果
7ac66c0f148de9519b8bd264312c4d64
加密補(bǔ)充
數(shù)據(jù)被加密后是不能被直接解密的,網(wǎng)站上的解密一般都是暴力解密,不斷地在猜在試有可能得出結(jié)果。
加鹽處理
我們還可以通過加鹽操作來提高破解數(shù)據(jù)的難度,加鹽其實(shí)就是在真正要被加密的數(shù)據(jù)中添加其他數(shù)據(jù)。
代碼示例
import hashlib h = hashlib.md5() h.update('你好帥'.encode('utf8')) # 假設(shè)為真實(shí)數(shù)據(jù) h.update(b'asgxfajchdvb') # 隨便打的數(shù)據(jù) res = h.hexdigest() print(res)
打印結(jié)果
ef77c21d860c3ccf4aed6e52720c8e42
因?yàn)?update 調(diào)用多次和調(diào)用一次的結(jié)果相同,我們可以把真假數(shù)據(jù)分開。
如果把假數(shù)據(jù)刪除,結(jié)果是: 195eaff9c88bceae9f094f5ef322e5da所以實(shí)現(xiàn)了對(duì)加密程度的升級(jí)。
動(dòng)態(tài)加鹽
我們可以不將假數(shù)據(jù)寫死,可以通過變量實(shí)現(xiàn)動(dòng)態(tài)加鹽,變量值可以是時(shí)間、用戶名的部分...
代碼示例
import hashlib x = 'asgxfajchdvb' h = hashlib.md5() h.update('你好帥'.encode('utf8')) h.update(x.encode('utf8')) res = h.hexdigest() print(res)
打印結(jié)果
ef77c21d860c3ccf4aed6e52720c8e42
和寫死的結(jié)果一樣。
加密應(yīng)用場景
1. 密碼加密如何比對(duì)
用戶輸入是明文但是到了程序里面之后會(huì)采用相同的加密算法變成密文,之后拿著密文與跟數(shù)據(jù)庫里面的密文比對(duì)如果一致就是密碼正確不一致就是錯(cuò)誤
2. 文件內(nèi)容一致性校驗(yàn)
作為軟件的提供者,提供安全軟件的同時(shí)會(huì)對(duì)給該軟件內(nèi)容做加密處理得到一個(gè)該安全軟件獨(dú)有的密文,用戶在下載軟件之后也會(huì)對(duì)內(nèi)容做相同的加密之后比對(duì)兩次密文是否一致,如果相同表示中途沒有被修改,如果不是表示中途被修改過,可能存在病毒
3. 針對(duì)大文件一致性校驗(yàn)的優(yōu)化策略
如果一個(gè)文件很大,那么如果全部讀取并加密速度太慢,這個(gè)時(shí)候可以考慮對(duì)文件內(nèi)容進(jìn)行切片讀取并加密的操作
到此這篇關(guān)于Python中的hashlib模塊解析的文章就介紹到這了,更多相關(guān)Python的hashlib模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于python實(shí)現(xiàn)的百度新歌榜、熱歌榜下載器(附代碼)
這篇文章主要介紹了基于python實(shí)現(xiàn)的百度新歌榜、熱歌榜下載器(附代碼),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08淺談Pytorch 定義的網(wǎng)絡(luò)結(jié)構(gòu)層能否重復(fù)使用
這篇文章主要介紹了Pytorch定義的網(wǎng)絡(luò)結(jié)構(gòu)層能否重復(fù)使用的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06python實(shí)現(xiàn)兩個(gè)dict合并與計(jì)算操作示例
這篇文章主要介紹了python實(shí)現(xiàn)兩個(gè)dict合并與計(jì)算操作,結(jié)合具體實(shí)例形式分析了Python使用collections.Counter進(jìn)行字典dict合并與遍歷輸出相關(guān)操作技巧,需要的朋友可以參考下2019-07-07python index() 與 rindex() 方法的使用示例詳解
這篇文章主要介紹了python index() 與 rindex() 方法的使用,需要的朋友可以參考下2022-12-12學(xué)習(xí)python中matplotlib繪圖設(shè)置坐標(biāo)軸刻度、文本
本篇文章給大家詳細(xì)介紹了python中matplotlib繪圖設(shè)置坐標(biāo)軸刻度、文本等基本知識(shí)點(diǎn),對(duì)此有興趣的朋友學(xué)習(xí)下吧。2018-02-02詳解有關(guān)PyCharm安裝庫失敗的問題的解決方法
這篇文章主要介紹了詳解有關(guān)PyCharm安裝庫失敗的問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02