Python值hashlib詳解


一、hashlib的基本概念

1、什么叫hash:hash是一種算法(不同的hash算法只是復雜度不一樣)(3.x里代替了md5模塊和sha模塊,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法),該算法接受傳入的內容,經過運算得到一串hash值
2、hash值的特點是(hash值/產品有三大特性:):
2.1 只要傳入的內容一樣,得到的hash值必然一樣=====>要用明文傳輸密碼文件完整性校驗
2.2 不能由hash值返解成內容=======》把密碼做成hash值,不應該在網絡傳輸明文密碼(只能有內容返回hash值)
2.3 只要使用的hash算法不變,無論校驗的內容有多大,得到的hash值長度是固定的(如從網上下載文件要進行hash校驗,保證網絡傳輸沒有丟包)
基於2.1和2.3可以做文件下載一致性的校驗
基於2.1和2.2可以對用戶密碼進行加密
hash算法就像一座工廠,工廠接收你送來的原材料(可以用m.update()
為工廠運送原材料),經過加工返回的產品就是hash值

二、如何產生hash值之三個階段

import hashlib         #(hash庫)
import hashlib
# # ######## 256 ########
# # 1、造出hash工廠
hash = hashlib.sha256('898oaFs09f'.encode('utf8'))     #同一種hash算法得到的長度是固定的
# # 2、運送原材料
hash.update('alvin'.encode('utf8'))                     #工廠傳入的原材料都是bytes類型
# # 3、產出hash值
print(hash.hexdigest())  # e79e68f070cdedcfe63eaf1a2e92c83b4cfb1b5c6bc452d214c1b7e77cdfd1c7



import hashlib
m=hashlib.md5()                               #括號內也可以傳值,類型也要求是bytes類型
m.update('你好呀!'.encode('utf-8'))
print(m.hexdigest())                          #9e49eb8e75b9a87424e388b862ea5f83

# 與上述hash的結果一樣
import hashlib
m=hashlib.md5(''.encode('utf-8'))          #括號內也可以傳值,類型也要求是bytes類型
m.update('好呀!'.encode('utf-8'))
print(m.hexdigest())   

三、校驗文件的一致性(如何保證下載的文件過程中不丟包,保證下載數據的完整性)

# -----------文件一致校驗----------------
'''可以拷貝一個文件放在兩個不同的盤中,然后通過判斷兩個文件的hash值是否相等,判斷兩個文件是否是同一個文件'''
import hashlib
m = hashlib.md5()
with open(r'G:/logging模塊配圖.png','rb') as f:
    for line in f:
        m.update(line)
print(m.hexdigest())          #47a6b079cc33a4f312786b46e61e0305

import hashlib
m = hashlib.md5()
with open(r'H:/logging模塊配圖.png','rb') as f:
    for line in f:
        m.update(line)
print(m.hexdigest()) 

四、對明文密碼進行加密

# 應用:對明文密碼進行加密(暴力破解-------用明文密碼用一種算法算出一個hash值,與截取的hash值進行比對,比對成功說明明文密碼一致,就可以破解用戶的密碼)
'''如用戶在某網站進行注冊信息,這個時候防止信息被惡意攔截獲取,可以對用戶明文密碼進行加密,存成hash值得形式,這樣用戶每次登陸雖然輸的是明文密碼,校驗hash值即可'''
password=input('>>>>>:').strip()
import hashlib
m=hashlib.md5()
m.update(password.encode('utf-8'))
print(m.hexdigest())             #00dcbdaede875d5e23f1f9f64c7849ef


# 對密碼進行加鹽(暗號)----------進一步加強密碼的安全性
password=input('>>>>>:').strip()
import hashlib
m=hashlib.md5()
m.update('一行白鷺上青天'.encode('utf-8'))         #對密碼加鹽
m.update(password.encode('utf-8'))
print(m.hexdigest())    

五、破解用戶注冊的密碼

# 重點
'''模擬撞庫破解密碼'''
import hashlib
passwds=[                      #可以通過random實現對passwds中的內容
    'alex3714',
    'alex1313',
    'alex94139413',
    'alex123456',
    '123456alex',
    'a123lex',
    ]

def make_passwd_dic(passwds):                #通過明文密碼列表,造出與之對應的hash值得字典
    dic={}
    for passwd in passwds:
        m=hashlib.md5()                      #使用md5算法,造了一個工廠
        m.update(passwd.encode('utf-8'))     #給工廠運送原材料(即我們要加密的內容)
        dic[passwd]=m.hexdigest()            #產出hash值(即最終的產品),將其加入到我們事先造好的空字典中,字典形式:{密碼:hash值}
    return dic

def break_code(cryptograph,passwd_dic):      #判斷攔截的hash值是否與字典中事先造好的hash值相等,相等則說明成功進行破解
    for k,v in passwd_dic.items():
        if v == cryptograph:
            print('密碼是===>\033[46m%s\033[0m' %k)

cryptograph='aee949757a2e698417463d47acac93df'     #我們攔截拿到的密碼,經過加密的hash值
break_code(cryptograph,make_passwd_dic(passwds))   #將要破解的密碼hash值,和事先造好的hash的字典當做函數的實參傳給對應的形參

六、hmac模塊的加密方式,與hashlib類似

'''python 還有一個 hmac 模塊,它內部對我們創建 key 和 內容 進行進一步的處理然后再加密:'''
import hmac
h = hmac.new('天王蓋地虎'.encode('utf8'))          #hmac必須要加鹽
h.update('hello'.encode('utf8'))
print(h.hexdigest())                 #1abaae8f65f68f2695a8545c5bc8e738

#要想保證hmac最終結果一致,必須保證:
#1:hmac.new括號內指定的初始key一樣
#2:無論update多少次,校驗的內容累加到一起是一樣的內容

# 下面單重方式得到的結果是一樣的
import hmac
h1=hmac.new(b'tom')          #初始值必須保證一致,最終得到的結果就會不一樣
h1.update(b'hello')
h1.update(b'world')
print(h1.hexdigest())

h2=hmac.new(b'tom')         #初始值必須保證一致,最終得到的結果就會不一樣
h2.update(b'helloworld')
print(h2.hexdigest())

h3=hmac.new(b'tomhelloworld')   #初始值不一樣,所以與上面兩種的結果不一樣
print(h3.hexdigest())

'''
0426ccec3b134e8c18fdcefee841ef25
0426ccec3b134e8c18fdcefee841ef25
ff1214d895bbaf5f1847db4ebae8212e
'''

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM