Python Show-Me-the-Code 第 0021題 密碼加密,pythonmd5加密

來源:互聯網
上載者:User

Python Show-Me-the-Code 第 0021題 密碼加密,pythonmd5加密

第 0021 題: 通常,登陸某個網站或者 APP,需要使用使用者名稱和密碼。密碼是如何加密後儲存起來的呢?請使用 Python 對密碼加密。

  • 閱讀資料 使用者密碼的儲存與 Python 樣本

  • 閱讀資料 Hashing Strings with Python

  • 閱讀資料 Python’s safest method to store and retrieve passwords from a database

思路:

加密技術是對資訊進行編碼和解碼的技術,編碼是把原來可讀資訊(又稱明文)譯成代碼形式(又稱密文),其逆過程就是解碼(解密)。加密技術的要點是密碼編譯演算法,密碼編譯演算法可以分為對稱式加密、不對稱式加密和無法復原加密三類演算法。

按照安全性由低到高,有這樣幾種選擇:

密碼明文直接儲存在系統中這種方法下密碼的安全性比系統本身還低,管理員能查看所有使用者的密碼明文。除非是做惡意網站故意套取使用者密碼,否則不要用這種方式密碼明文經過轉換後再儲存與直接儲存明文的方式沒有本質區別,任何知道或破解出轉換方法的人都可以逆轉換得到密碼純文字密碼經過對稱式加密後再儲存密碼明文的安全性等同於加密金鑰本身的安全性。對稱式加密的密鑰可同時用於加密與解密。一般它會直接出現在加密代碼中,破解的可能性相當大。而且系統管理員很可能知道密鑰,進而算出密碼原文密碼經過非對稱式加密後再儲存密碼的安全性等同於私密金鑰的安全性。密碼明文經過公開金鑰加密。要還原密碼明文,必須要相應的私密金鑰才行。因此只要保證私密金鑰的安全,密碼明文就安全。私密金鑰可以由某個受信任的人或機構來掌管,身分識別驗證只需要用公開金鑰就可以了實際上,這也是 HTTPS/SSL 的理論基礎。這裡的關鍵是 私密金鑰的安全 ,如果私密金鑰泄露,那密碼明文就危險了。

以上 4 種方法的共同特點是可以從儲存的密碼形式還原到密碼明文。

所以密碼最好是以不可還原明文的方式來儲存。通常利用雜湊演算法的單向性來保證明文以 不可還原的有損方式 進行儲存。

這類方法的各個具體操作方式按安全性由低到高依次為:

使用自己獨創的雜湊演算法對密碼進行雜湊,儲存雜湊過的值雜湊演算法複雜,獨創對理論要求很高。一般獨創的雜湊演算法肯定沒有公開經過時間檢驗的演算法品質高,天才另算使用 MD5 或 SHA-1 雜湊演算法MD5 和 SHA-1 已破解。雖不能還原明文,但很容易找到能產生相同雜湊值的替代明文。而且這兩個演算法速度較快,暴力破解相對省時,建議不要使用它們。使用更安全的 SHA-256 等成熟演算法更加複雜的演算法增加了暴力破解的難度。但如果遇到簡單密碼,用彩虹字典的暴力破解法,很快就能得到密碼原文加入隨機 salt 的雜湊演算法密碼原文(或經過 hash 後的值)和隨機產生的 salt 字串混淆,然後再進行 hash,最後把 hash 值和 salt 值一起儲存。驗證密碼的時候只要用 salt 再與密碼原文做一次相同步驟的運算,比較結果與儲存的 hash 值就可以了。這樣一來哪怕是簡單的密碼,在進過 salt 混淆後產生的也是很不常見的字串,根本不會出現在彩虹字典中。salt 越長暴力破解的難度越大

所以加入隨機salt的雜湊演算法是一個安全性比較好的密碼編譯演算法,能夠廢掉彩虹表,加入隨機salt,每一個使用者哪怕密碼一樣密文值也不一樣。下面使用python實現這種加密方法。

代碼:

0021.密碼加密.py

#coding: utf-8import randomfrom hashlib import sha256from hmac import HMACdef set_password(raw_password, salt=None):    if salt is None:        salt = sha256(str(random.random())).hexdigest()[-8:]    if isinstance(raw_password, unicode):        raw_password = raw_password.encode('utf-8')    # password = sha256('%s%s' % (salt, raw_password)).hexdigest()    password = HMAC(salt, raw_password, sha256).hexdigest()    return ('%s$%s' % (salt, password))def check_password(raw_password, enc_password):    salt = enc_password.split('$')[0]    return enc_password == set_password(raw_password, salt)if __name__ == '__main__':    raw_password1 = 'hehe'    raw_password2 = 'test'    salt = '12345678'    enc_password1 = set_password(raw_password1)    enc_password2 = set_password(raw_password2, salt)    print 'enc_password1:%s' % enc_password1    print 'enc_password2:%s' % enc_password2    print check_password(raw_password1, enc_password1)    print check_password(raw_password2, enc_password1)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.