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