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值
import hashlib #(hash庫) import hashlib # # ######## 256 ######## # # 一、造出hash工廠 hash = hashlib.sha256('898oaFs09f'.encode('utf8')) #同一種hash算法獲得的長度是固定的 # # 二、運送原材料 hash.update('alvin'.encode('utf8')) #工廠傳入的原材料都是bytes類型 # # 三、產出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的字典當作函數的實參傳給對應的形參
'''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 '''