下面的概念是百度百科的:python
Message Digest Algorithm MD5(中文名爲消息摘要算法第五版)爲計算機安全領域普遍使用的一種散列函數,用以提供消息的完整性保護。該算法的文件號爲RFC 1321(R.Rivest,MIT Laboratory for Computer Science and RSA Data Security Inc. April 1992)。算法
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用於確保信息傳輸完整一致。是計算機普遍使用的雜湊算法之一(又譯摘要算法、哈希算法),主流編程語言廣泛已有MD5實現。將數據(如漢字)運算爲另外一固定長度值,是雜湊算法的基礎原理,MD5的前身有MD二、MD3和MD4。數據庫
MD5的做用是讓大容量信息在用數字簽名軟件簽署私人密鑰前被"壓縮"成一種保密的格式(就是把一個任意長度的字節串變換成必定長的十六進制數字串)。除了MD5之外,其中比較有名的還有sha-一、RIPEMD以及Haval等。編程
# 因爲MD5模塊在python3中被移除 # 在python3中使用hashlib模塊進行md5操做 import hashlib # 待加密信息 str = '123456' # 建立md5對象 hl = hashlib.md5() #更新hash對象的值,若是不使用update方法也能夠直接md5構造函數內填寫 #md5_obj=hashlib.md5("123456".encode("utf-8")) 效果同樣 hl.update(str.encode("utf-8")) print('MD5加密前爲 :' + str) print('MD5加密後爲 :' + hl.hexdigest())
如今大部分應用中咱們會採用MD5進行有關於密碼的加密,MD5以前最大的一個點就是不可逆的,可是中國山東數學家王小云等在Crypto 2004上提出一種能成功攻破MD5的算法安全
也有一些網站提供了MD5的加密和解密的過程,可是這些網站都是經過暴力破解的方式實現的dom
那麼MD5被攻破了還有什麼好的方式解決這個問題麼?
第一就是雙重MD5加密
第二個就是MD5加鹽值(SALT)編程語言
md5_obj=hashlib.md5("123456".encode("utf-8")) str1=md5_obj.hexdigest() #加密1次 obj2=hashlib.md5(str1.encode("utf-8")) str2=obj2.hexdigest()#加密2次 print(str2) #雙重加密後,一樣解密開
前面說到MD5不管是王小云的演講已經破解,仍是各大網站的暴力破解,都須要再一次提升MD5的安全性。所謂加鹽就是加一些輔助的調料,這裏稱爲Salt值。
舉個栗子,好比用戶註冊的密碼,確定不能明文存數據庫,固然如今確定不會再出現CSDN這種事情了,那密碼加密以前是單純的使用MD5,如今要給MD5加點調料,那問題是最終MD5不可逆,用戶註冊後第二次怎麼登錄?函數
數據庫在存儲的時候須要在表裏面多加一個Salt字段,用來存儲你加的調料是什麼,等用戶登陸的時候,拿用戶註冊的密碼+Salt字段,而後再進行MD5,而後再用加密後的內容和數據庫存儲的MD5密碼進行匹配,成功的話則提示成功,匹配失敗的話就登陸失敗。網站
from random import Random import hashlib # 獲取由4位隨機大小寫字母、數字組成的salt值 def create_salt(length = 4): salt = '' chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789' len_chars = len(chars) - 1 random = Random() for i in range(length): # 每次從chars中隨機取一位 salt += chars[random.randint(0, len_chars)] return salt # 獲取原始密碼+salt的md5值 def create_md5(pwd,salt): md5_obj = hashlib.md5() md5_obj.update((pwd + salt).encode("utf-8")) return md5_obj.hexdigest() # 原始密碼 pwd = '123456' # 隨機生成4位salt salt = create_salt() # 加密後的密碼 md5 = create_md5(pwd, salt) print('[pwd]\n',pwd ) print('[salt]\n', salt) print('[md5]\n', md5)