1. 程式人生 > 實用技巧 >Python模組學習——hashlib模組講解

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值

PS:如有需要Python學習資料的小夥伴可以加下方的群去找免費管理員領取

可以免費領取原始碼、專案實戰視訊、PDF檔案等

二:將指定的 “字串” 進行加密。使用hashlib的分步解析

1)在進行md5雜湊運算前,需要對資料進行編碼,否則報錯

import hashlib

obj = hashlib.md5()   #構造一個hashlib的物件
obj.update("小馬過河") #update對指定字串進行加密 print(obj) --------------結果: obj.update("小馬過河") TypeError: Unicode-objects must be encoded before hashing 2)obj是hash物件 import hashlib obj = hashlib.md5() obj.update("小馬過河".encode("utf-8")) print(obj,type(obj)) -------------------結果: <md5 HASH object @ 0x001C5590> <class
'_hashlib.HASH'> 3import hashlib obj = hashlib.md5() obj.update("小馬過河".encode("utf-8")) result=obj.hexdigest() print(result) --------------結果: 24f67b0f6d02adc8867d612e0e0fc40a 4)給加密增添難度 import hashlib obj = hashlib.md5("mcw@xiaoma@aaaafffff".encode("utf-8")) #新增一些內容,提高加密複雜度。此處的字串也要先編碼, obj.update("小馬過河".encode('utf-8')) result = obj.hexdigest() print(result) -------------------結果: b11740508f28e04837f2c0e3a58cf990 5)用hashlib做成加密函式(新增基礎的字元了的) import hashlib def get_md5(data): #傳參為需要加密的字串 obj = hashlib.md5("sidrsicxwersdfsaersdfsdfresdy54436jgfdsjdxff123ad".encode('utf-8')) obj.update(data.encode('utf-8')) result = obj.hexdigest()           return result val = get_md5('123') print(val) --------------結果: 35093270b6352fa9721370b781f7b4d7

三:應用場景案例:使用者賬號密碼登入,對明文密碼進行加密

import hashlib

USER_LIST = []
def get_md5(data):
    obj = hashlib.md5("12:;idrsicxwersdfsaersdfsdfresdy54436jgfdsjdxff123ad".encode('utf-8'))
    obj.update(data.encode('utf-8'))
    result = obj.hexdigest()
    return result

def register():
    print('**************使用者註冊**************')
    while True:
        user = input('請輸入使用者名稱:')
        if user == 'N':
            return
        pwd = input('請輸入密碼:')
        temp = {'username':user,'password':get_md5(pwd)}
        USER_LIST.append(temp)

def login():
    print('**************使用者登陸**************')
    user = input('請輸入使用者名稱:')
    pwd = input('請輸入密碼:')


    for item in USER_LIST:
        if item['username'] == user and item['password'] == get_md5(pwd):
            return True

register()
result = login()
if result:
    print('登陸成功')

else:
    print('登陸失敗')

------------------------結果:

**************使用者註冊**************

請輸入使用者名稱:小馬過河

請輸入密碼:123456

請輸入使用者名稱:N

**************使用者登陸**************

請輸入使用者名稱:小馬過河

請輸入密碼:123456

登陸成功

使用者登入場景分析:實現使用者註冊,然後進行使用者登入的程式碼分析。

程式碼分析:

四、校驗檔案的一致性(如何保證下載的檔案過程中不丟包,保證下載資料的完整性)

# -----------檔案一致校驗----------------

'''可以拷貝一個檔案放在兩個不同的盤中,然後通過判斷兩個檔案的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'))

六、破解使用者註冊的密碼

# 重點
'''模擬撞庫破解密碼'''

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

'''

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理。

作者:Python極客專欄