Python的哈希hashlib模塊詳細(xì)解讀
1.hashlib模塊
hashlib是一個(gè)提供字符加密功能的模塊,包含MD5和SHA的加密算法,具體支持md5,sha1, sha224, sha256, sha384, sha512等算法。 該模塊在用戶登錄認(rèn)證方面應(yīng)用廣泛,對(duì)文本加密也很常見。
**哈希算法(Hash Algorithm):**簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數(shù);哈希算法是一種壓縮映射,也就是說散列值的空間通常遠(yuǎn)小于輸入的空間,不同的輸入可能會(huì)散列成相同的輸出,所以不可能從散列值來確定唯一的輸入值
哈希的特點(diǎn):
1)只要輸入一樣,輸出的哈希必然一樣(用于文件、下載完整性校驗(yàn));
2)哈希算法不可逆,即使拿到哈希,也不能推出源文件;
3)只要使用的哈希算法不變,無論校驗(yàn)的內(nèi)容是否一樣,得到的哈希長度是固定的.
加鹽
加鹽(salt)加密(簡稱“加鹽”)是一種對(duì)系統(tǒng)登錄口令的加密方式,它實(shí)現(xiàn)的方式是將每一個(gè)口令同一個(gè)叫做”鹽“(salt)的n位隨機(jī)數(shù)相關(guān)聯(lián)
無論何時(shí)只要口令改變,隨機(jī)數(shù)就改變;隨機(jī)數(shù)以未加密的方式存放在口令文件中,這樣每個(gè)人都可以讀;不再只保存加密過的口令,而是先將口令和隨機(jī)數(shù)連接起來然后一同加密,加密后的結(jié)果放在口令文件中
2.基本調(diào)用
import hashlib new_md5 = hashlib.md5() #創(chuàng)建hashlib的md5對(duì)象 new_md5.update('字符串') #將字符串載入到md5對(duì)象中,獲得md5算法加密。 print(new_md5.hexdigest()) #通過hexdigest()方法,獲得new_md5對(duì)象的16進(jìn)制md5顯示。
簡單來說。就是三步:
1,建立加密對(duì)象。
2,對(duì)字符串進(jìn)行算法加密。
3,獲得16進(jìn)制顯示
可以創(chuàng)建的加密算法有:md5,sha1, sha224, sha256, sha384, sha512
例:
new_md5 = hashlib.md5() new_sha1 = hashlib.sha1() new_sha256 = hashlib.sha256()
簡單調(diào)用:
new_md5 = hashlib.new('md5',b'字符串').hexdigest() #或者 new_md5 = hashlib.md5(str(time.time().encode('utf-8')).hexdigest()
注意: 向?qū)ο笾袀魅胱址畷r(shí),必須為編碼類型。可以使用字符串前b’ '的方法或使用.encode(‘UTF-8’)的方法,使字符串變?yōu)閎ytes類型。
下面我們將引入一個(gè)簡單的實(shí)力來說明最常用的MD5算法在實(shí)際中的應(yīng)用。在引入實(shí)力前,讓我們先對(duì)MD5的基本特性有個(gè)認(rèn)識(shí)。
3.擴(kuò)展 md5算法的特點(diǎn)
- 壓縮性:任意長度的數(shù)據(jù),算出的MD5值的長度都是固定的。
- 容易計(jì)算:從原數(shù)據(jù)計(jì)算出的MD5值很容易。不管數(shù)據(jù)多大,很快就能算出一串MD5字符串來。
- 抗修改性:對(duì)原數(shù)據(jù)進(jìn)行任何改動(dòng),哪怕修改任何一個(gè)字節(jié),生成的MD5值也有會(huì)很大的區(qū)別。
- 強(qiáng)抗碰撞:已知原數(shù)據(jù)和MD5,想找到一個(gè)具有相同MD5值的數(shù)據(jù)(即偽造數(shù)據(jù))是非常困難的。
好啦,那我們已經(jīng)知道了MD5算法的特點(diǎn)。那么問題來了,MD5既然每次生成的值都是固定的。那么雖然是單向生成不可反推,但是如果通過碰撞方法對(duì)字符串生成MD5后與MD5值碰撞,是不是就會(huì)得到MD5對(duì)應(yīng)的字符串了呢?答對(duì)了!這樣是可以的,換句話說,如果某用戶數(shù)據(jù)庫泄露了,拿到了密碼庫中的MD5就能通過碰撞的方法將密碼破解出來。那么問題又來了,既然這樣,那也沒有什么用了啊。。非也,讓我們用一個(gè)小小的技巧,讓這個(gè)碰撞方法失效。這個(gè)方法就是“加鹽”,什么是加鹽呢?
“加鹽”就是對(duì)原密碼添加額外的字符串,然后再生成MD5值,這樣就沒有辦法進(jìn)行破解了,除非拿到“加鹽”字符串,但碰撞方法也是需要一個(gè)一個(gè)重新計(jì)算MD5值后再進(jìn)行碰撞對(duì)比的,難度也是極其大的。那么看下面的代碼吧:
例:MD5密碼認(rèn)證,帶“加鹽”方法
import hashlib import os salt = '!任#意%字^符@' # 定義加鹽字符串 # salt = os.urandom(16).decode() # 函數(shù)定位:返回一個(gè)有16個(gè)byte那么長的一個(gè)string,然后很適合用于加密。 pwd = input('>>>') md5_pwd = hashlib.md5() md5_pwd.update((pwd+salt).encode('UTF-8')) # 加鹽 pwd = md5_pwd.hexdigest() #pwd = hashlib.new('md5',(pwd+salt).encode('UTF-8')).hexdigest() # 也可以這樣簡寫哦。一句話搞定。
到此這篇關(guān)于Python的哈希hashlib模塊詳細(xì)解讀的文章就介紹到這了,更多相關(guān)Python的hashlib模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
windows10在visual studio2019下配置使用openCV4.3.0
這篇文章主要介紹了windows10在visual studio2019下配置使用openCV4.3.0,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07使用keras實(shí)現(xiàn)BiLSTM+CNN+CRF文字標(biāo)記NER
這篇文章主要介紹了使用keras實(shí)現(xiàn)BiLSTM+CNN+CRF文字標(biāo)記NER,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06python自動(dòng)化測(cè)試實(shí)例解析
這篇文章主要介紹了python自動(dòng)化測(cè)試實(shí)例,并對(duì)實(shí)例中的注意點(diǎn)進(jìn)行了簡單的分析,需要的朋友可以參考下2014-09-09python自帶tkinter庫實(shí)現(xiàn)棋盤覆蓋圖形界面
這篇文章主要為大家詳細(xì)介紹了python自帶tkinter庫實(shí)現(xiàn)棋盤覆蓋圖形界面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07Python實(shí)現(xiàn)基于多線程、多用戶的FTP服務(wù)器與客戶端功能完整實(shí)例
這篇文章主要介紹了Python實(shí)現(xiàn)基于多線程、多用戶的FTP服務(wù)器與客戶端功能,結(jié)合完整實(shí)例形式分析了Python多線程、多用戶FTP服務(wù)器端與客戶端相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下2017-08-08Python Tkinter圖形工具使用方法及實(shí)例解析
這篇文章主要介紹了Python Tkinter圖形工具使用方法及實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06