博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python中MD5加密
阅读量:6590 次
发布时间:2019-06-24

本文共 2146 字,大约阅读时间需要 7 分钟。

MD5是什么

下面的概念是百度百科的:

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的前身有MD2、MD3和MD4。

MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1、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的加密和解密的过程,但是这些网站都是通过暴力破解的方式实现的

那么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)

转载地址:http://zgkio.baihongyu.com/

你可能感兴趣的文章
深入理解javascript函数
查看>>
iOS动画编程-AutoLayout动画[ 3 ] Animating by replacing constraints
查看>>
纯CSS+HTML自定义checkbox效果
查看>>
如何使用 Grape-Swagger 生成 API 文档
查看>>
Unity组件:Lens Flare 镜头光晕
查看>>
如何成为高级java程序员
查看>>
洛谷 P1131 BZOJ 1060 [ZJOI2007]时态同步
查看>>
Java中的泛型 --- Java 编程思想
查看>>
javaScript跨浏览器事件处理程序
查看>>
Angular学习笔记
查看>>
WebView 支持 Html5 video 进行全屏播放
查看>>
设计模式 之 中介者模式
查看>>
项目启动之spring篇
查看>>
图像数据增强方法一览(附python代码)
查看>>
socket异步编程--libevent的使用
查看>>
帮你偷懒的靠谱幻灯工具
查看>>
【学习笔记】hive 之行拆列explode
查看>>
【vue】指令修饰符,键盘事件,阻止默认事件,阻止事件传播
查看>>
区块链开发公司浅析区块链技术给保险行业的创新
查看>>
NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang
查看>>