Python中MD5加密

MD5是什麼

下面的概念是百度百科的: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等。編程

Python中生成MD5

# 因爲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進行有關於密碼的加密,MD5以前最大的一個點就是不可逆的,可是中國山東數學家王小云等在Crypto 2004上提出一種能成功攻破MD5的算法安全

也有一些網站提供了MD5的加密和解密的過程,可是這些網站都是經過暴力破解的方式實現的dom

那麼MD5被攻破了還有什麼好的方式解決這個問題麼?
第一就是雙重MD5加密
第二個就是MD5加鹽值(SALT)編程語言

雙重MD5加密

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加鹽值(SALT)

前面說到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)
相關文章
相關標籤/搜索