下面的概念是百度百科的: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)