日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hashlib 模块用来进行hash

發(fā)布時間:2023/12/9 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hashlib 模块用来进行hash 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

hashlib的基本概述:

  python中的 hashlib 模塊用來進(jìn)行hash 或者md5加密,而且這種加密是不可逆的,所以這種算法又被稱為摘要算法,

其支持Opennssl庫提供的所有算法,包括 md5、sha1、sha224、sha256、sha512 等。

?

?

hash是一種算法 是將一個任意長的數(shù)據(jù) 根據(jù)計(jì)算 得到一個固定長度特征嗎

 特征:1、不同輸入 ? 可能會有相同的結(jié)果 幾率特別小

    2、相同的輸入 必然得到相同結(jié)果

    3、由于散列(特征)的性質(zhì) 從原理來看是不可能 反解

    4、用來 驗(yàn)證 ? 兩個輸入的數(shù)據(jù)是否一致

 使用場景

   1、密碼驗(yàn)證

   2、驗(yàn)證數(shù)據(jù)是否被篡改? 比如游戲安裝包 ?? 有沒有被改過

 為了防止別人撞庫成功? 可用提升密碼的復(fù)雜度 ? 其次可以為密碼加鹽(加點(diǎn)內(nèi)容進(jìn)去)

ps:撞庫破解的原理? 把常見的 明文和密文的對應(yīng)關(guān)系 存到了數(shù)據(jù)庫中? 運(yùn)氣好就能查詢到

?

常用的屬性方法

  algorithms : 列出所有加密算法

  digesti——size: 產(chǎn)生的散列的字節(jié)大小

  md5()/sha1() :創(chuàng)建一個 md5 或者 sha1加密模式的hash 對象

  update(arg) :用字符串參數(shù)來更新hash對象,如果同一個has對象重復(fù)調(diào)用該方法,如下:m.update(a); m.update(b), 則等于m.update(a+b)

  digest() : 返回摘要,作為二進(jìn)制數(shù)據(jù)字符串值

  hexdigest() : 返回摘要,作為十六進(jìn)制數(shù)據(jù)字符串值

  copy() :復(fù)制

?

下面是一個簡單的實(shí)例:

import hashlib m = hashlib.md5("aaa".encode("utf-8")) print(m.hexdigest())

結(jié)果如下:

47bce5c74f589f4867dbd57e9ca9f808

?

下面是一個簡單的加鹽實(shí)例:

import hashlibm = hashlib.md5("321".encode("utf-8")) # m.update("abcdefplkjoujhh".encode("utf-8"))print(m.hexdigest())

結(jié)果如下:

7da0befdd8fd811dd0716941c38c0111

?

關(guān)于hmac 的實(shí)例:

import hmac # 與hashlib 沒啥區(qū)別 只是在創(chuàng)建的時候必須加鹽 h = hmac.new("abcdefjjjj".encode("utf-8"))h.update("123".encode("utf-8"))print(h.hexdigest())

結(jié)果如下:

944b3523fac69f32f6d399a11707da8b

?

如何產(chǎn)生hash值的三個階段:

import hashlib # # ######## sha256 ######## # # 1、造出hash工廠 hash = hashlib.sha256('12345ds232'.encode('utf8')) #同一種hash算法得到的長度是固定的 # # 2、運(yùn)送原材料 hash.update('alvin'.encode('utf8')) #工廠傳入的原材料都是bytes類型 # # 3、產(chǎn)出hash值 print(hash.hexdigest()) #結(jié)果:0f63932f6e2b2d1e0d9c2d50f0e9d39b79da78a5048a6d054d7f9c27d1a8761a

?

效驗(yàn)文件的一致性(如何保證下載的文件過程中不丟包,保證數(shù)據(jù)的完整性!):

# -----------文件一致校驗(yàn)---------------- '''可以拷貝一個文件放在兩個不同的盤中,然后通過判斷兩個文件的hash值是否相等,判斷兩個文件是否是同一個文件''' import hashlib m = hashlib.md5() with open(r'F:\oldboy課程記錄\目錄創(chuàng)建函數(shù).py','rb') as f:for line in f:m.update(line) print(m.hexdigest()) #18b6754864943d03b5b2aedacb449466import hashlib m = hashlib.md5() with open(r'F:\oldboy課程記錄\購物車練習(xí).py','rb') as f:for line in f:m.update(line) print(m.hexdigest()) #8e63f67a0049d1fc583a5c2bbf6cf3a8

?

對密碼進(jìn)行加鹽(加密):

# 應(yīng)用:對明文密碼進(jìn)行加密(暴力破解-------用明文密碼用一種算法算出一個hash值,與截取的hash值進(jìn)行比對,比對成功說明明文密碼一致,就可以破解用戶的密碼) '''如用戶在某網(wǎng)站進(jìn)行注冊信息,這個時候防止信息被惡意攔截獲取,可以對用戶明文密碼進(jìn)行加密,存成hash值得形式,這樣用戶每次登陸雖然輸?shù)氖敲魑拿艽a,校驗(yàn)hash值即可''' #未加密 password=input('>>>>>:').strip() import hashlib m=hashlib.md5() m.update(password.encode('utf-8')) print(m.hexdigest()) #00dcbdaede875d5e23f1f9f64c7849ef# 對密碼進(jìn)行加鹽(暗號)----------進(jìn)一步加強(qiáng)密碼的安全性 password=input('>>>>>:').strip() import hashlib m=hashlib.md5() m.update('一行白鷺上青天'.encode('utf-8')) #對密碼加鹽 m.update(password.encode('utf-8')) print(m.hexdigest())

?

hmac模塊的加密方式,與hashlib差不多:

'''python 還有一個 hmac 模塊,它內(nèi)部對我們創(chuàng)建 key 和 內(nèi)容 進(jìn)行進(jìn)一步的處理然后再加密:''' import hmac h = hmac.new('天王蓋地虎'.encode('utf8')) #hmac必須要加鹽 h.update('hello'.encode('utf8')) print(h.hexdigest()) #1abaae8f65f68f2695a8545c5bc8e738#要想保證hmac最終結(jié)果一致,必須保證: #1:hmac.new括號內(nèi)指定的初始key一樣 #2:無論update多少次,校驗(yàn)的內(nèi)容累加到一起是一樣的內(nèi)容 # 下面單重方式得到的結(jié)果是一樣的 import hmac h1=hmac.new(b'tom') #初始值必須保證一致,最終得到的結(jié)果就會不一樣 h1.update(b'hello') h1.update(b'world') print(h1.hexdigest())h2=hmac.new(b'tom') #初始值必須保證一致,最終得到的結(jié)果就會不一樣 h2.update(b'helloworld') print(h2.hexdigest())h3=hmac.new(b'tomhelloworld') #初始值不一樣,所以與上面兩種的結(jié)果不一樣 print(h3.hexdigest())

結(jié)果如下:

0426ccec3b134e8c18fdcefee841ef25 0426ccec3b134e8c18fdcefee841ef25 ff1214d895bbaf5f1847db4ebae8212e

?

破解用戶的密碼

# 重點(diǎn) '''模擬撞庫破解密碼''' import hashlib passwds=[ #可以通過random實(shí)現(xiàn)對passwds中的內(nèi)容'alex3714','alex1313','alex94139413','alex123456','123456alex','a123lex',]def make_passwd_dic(passwds): #通過明文密碼列表,造出與之對應(yīng)的hash值得字典dic={}for passwd in passwds:m=hashlib.md5() #使用md5算法,造了一個工廠m.update(passwd.encode('utf-8')) #給工廠運(yùn)送原材料(即我們要加密的內(nèi)容)dic[passwd]=m.hexdigest() #產(chǎn)出hash值(即最終的產(chǎn)品),將其加入到我們事先造好的空字典中,字典形式:{密碼:hash值}return dicdef break_code(cryptograph,passwd_dic): #判斷攔截的hash值是否與字典中事先造好的hash值相等,相等則說明成功進(jìn)行破解for k,v in passwd_dic.items():if v == cryptograph:print('密碼是===>\033[46m%s\033[0m' %k)cryptograph='aee949757a2e698417463d47acac93df' #我們攔截拿到的密碼,經(jīng)過加密的hash值 break_code(cryptograph,make_passwd_dic(passwds)) #將要破解的密碼hash值,和事先造好的hash的字典當(dāng)做函數(shù)的實(shí)參傳給對應(yīng)的形參

?

轉(zhuǎn)載于:https://www.cnblogs.com/TF511/p/9818605.html

總結(jié)

以上是生活随笔為你收集整理的hashlib 模块用来进行hash的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。