python——hashlib模塊

提供多種哈希算法的模塊。

哈希算法:又叫摘要算法,是一種給定輸入計算出一種特殊的結果。哈希算法不可逆,比如輸入一串字符串,輸出一串奇怪的字符串,無法根據輸出反向算出輸入(除了暴力窮舉破解)。

哈希算法可以用於校驗文件一致性,對多個文件使用相同的哈希算法,若得到的結果相同,則表示文件完全相同,沒有丟失或修改數據。

哈希算法有如下:
md5
sha1,sha224, sha256, sha384, sha512,
blake2b, blake2s
sha3_224, sha3_256, sha3_384, sha3_512
shake_128, shake_256……

在該模塊中,以上算法都是類,可以調用產生相應的hash對象。

其中md5和sha1較常見,但是都可能發生碰撞。sha384 和sha512 在32位的平臺上會較慢。
碰撞:不同的輸入產生了相同的Hash結果。

該模塊產生的hash對象具有以下四種方法

-update(data):對輸入字節更新哈希對象。更新不是替換,重複調用和將所有輸入字符串拼起來一次性調用,產生相同結果。
-digest():返回update方法中輸入的hash結果,爲bytes對象。
-hexdigest():與digest()類似,但是僅包含十六進制數字,長度是digest結果的兩倍。
-copy():複製哈希對象並返回,可用於計算公共初始子字符串的數據hash結果。

用法舉例

上文中已列舉出了hashlib模塊中的類(哈希算法),因爲這些類的使用方法相同,下文僅以md5算法作爲示例。

注意:若輸入字符串,需要編碼。因爲字符串是unicode對象,無法直接使用哈希算法!在字符串前加上b,將該字符串類型轉爲bytes類型,等價於使用‘utf-8’編碼。

import hashlib
password= hashlib.md5()
password.update(b"abcdef123")   #即:'abcdef123'.encode('utf-8')
password.digest()     #b'\xaa|\x9c\x12\xfct\tU\xefM\xfa\xd6p%\x0f\xf4'
password.update(b"xyz")   #和password.update(b"abcdef123xyz")產生的hash對象相同

#也可以用如下方法直接輸入文本
password=hashlib.md5('abcdef123'.encode('gbk'))    #字符串輸入時需要編碼
password.hexdigest()  #aa7c9c12fc740955ef4dfad670250ff4      32位
password.digest()     #b'\xaa|\x9c\x12\xfct\tU\xefM\xfa\xd6p%\x0f\xf4'    16位

由以上輸出可知,相同字符串編碼方式不同,使用相同的hash算法產生的對象相同。

使用哈希算法時,對密碼加鹽是一種加強安全性的手段,可以防止暴力破解明文密碼。

import hashlib
password='abcdef123'   #原密碼
salt='tgrcxn'   
salted_password=password+salt
hashlib.md5(salted_password.encode('ascii')).hexdigest()  #對加鹽的密碼獲得hash對象
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章