提供多種哈希算法的模塊。
哈希算法:又叫摘要算法,是一種給定輸入計算出一種特殊的結果。哈希算法不可逆,比如輸入一串字符串,輸出一串奇怪的字符串,無法根據輸出反向算出輸入(除了暴力窮舉破解)。
哈希算法可以用於校驗文件一致性,對多個文件使用相同的哈希算法,若得到的結果相同,則表示文件完全相同,沒有丟失或修改數據。
哈希算法有如下:
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對象