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