python 操作 MD5
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 = '
# 创建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(".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 = '
# 随机生成4位salt
salt = create_salt()
# 加密后的密码
md5 = create_md5(pwd, salt)
print('[pwd]\n',pwd )
print('[salt]\n', salt)
print('[md5]\n', md5)```
二:Python暴力破解md5(明文只有英文和数字,没有中文):
import hashlib
from string import ascii_letters,digits
from itertools import permutations
from time import time
all_letters=ascii_letters+digits+'.,;'
#解密md5
def decrypt_md5(md5_value):
if len(md5_value)!=32:
print('error')
return
md5_value=md5_value.lower()
for k in range(5,10):
for item in permutations(all_letters,k):
item=''.join(item)
print '.',
if hashlib.md5(item.encode()).hexdigest()==md5_value:
return item
md5_value ='33ef041f2387ab2a933c47c5764ccb84'
start=time()
result=decrypt_md5(md5_value)
if result:
print('\n Success: '+md5_value+'==>'+result)
print('Time used:',time()-start)
注:
1. permutations 表示全排列
2.hexdigest 表示十六进制数据字符串值
#permutationsfor i in permutations([1, 1, 3], 3):
print i
(1, 1, 3)
(1, 3, 1)
(1, 1, 3)
(1, 3, 1)
(3, 1, 1)
(3, 1, 1)
hash.hexdigest() 返回摘要,作为十六进制数据字符串值
python 操作 MD5的更多相关文章
- Python操作MySQL-day11
写在前面 上课第11天,打卡: 包子有肉,不在褶上: 前言 存储和数据库是整个网站架构的瓶颈 关系型数据库(MySQL | Oracle) 类似于excel表格 用结构化查询语言SQL进行存取的 非关 ...
- python 操作 hbase
python 是万能的,当然也可以通过api去操作big database 的hbase了,python是通过thrift去访问操作hbase 以下是在centos7 上安装操作,前提是hbase已经 ...
- 第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型
第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型 Hash操作,redis中Hash在内存中的存储格式如下图: hset(name, key, value)name ...
- python操作RabbitMQ(不错)
一.rabbitmq RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列 ...
- Python操作数据库及hashlib模块
一.hashlib模块 hashlib模块,主要用于加密相关的操作,在python3的版本里,代替了md5和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA51 ...
- Python(九) Python 操作 MySQL 之 pysql 与 SQLAchemy
本文针对 Python 操作 MySQL 主要使用的两种方式讲解: 原生模块 pymsql ORM框架 SQLAchemy 本章内容: pymsql 执行 sql 增\删\改\查 语句 pymsql ...
- Python 【第六章】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...
- 练习:python 操作Mysql 实现登录验证 用户权限管理
python 操作Mysql 实现登录验证 用户权限管理
- Python操作MySQL
本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb ...
随机推荐
- 多线程同步synchornized、volatile、Atomic、CountDownLatch示例
synchronized关键字 锁对象.synchronized(this)和synchronized方法都是锁当前对象. import java.util.concurrent.TimeUnit; ...
- Struts2源码解析-----转载
前面一节描述的Struts2很多东西,这节是对源码进行分析描述,通过这一节应该对struts2有了清楚认识! 还是把Struts2这个框图贴出来: 第一步:HttpServletRequest进入到S ...
- mysql执行sql语句过程
开发人员基本都知道,我们的数据存在数据库中(目前最多的是mysql和oracle,由于作者更擅长mysql,所以这里默认数据库为mysql),服务器通过sql语句将查询数据的请求传入到mysql数据库 ...
- 如何在OneNote for Mac 中插入文件附件?
OneNote 2016 Mac是一款非常方便的云笔记软件,可以随时记录您稍纵即逝的创意,灵感和发现,发挥您的潜能,简化你的生活和工作.有用户反应如何在OneNote for Mac 中插入文件附件呢 ...
- 解决js数组循环删除出错
for(var i=0,flag=true,len=arr.length;i<len;flag ? i++ : i){ if( arr[i]&&arr[i].status==0 ...
- ----XMLHttpRequestAPI简单介绍----
XMLHttpRequest 使用XMLHttpRequest (XHR)对象可以与服务器交互.您可以从URL获取数据,而无需让整个的页面刷新.这使得Web页面可以只更新页面的局部,而不影响用户的操作 ...
- js 中 (function($){...})(jQuery) 含义
js中定义函数常用写法是 function name(arg){ //arg则是匿名函数的参数. //... } 调用函数时的写法是: name(arg); ===================== ...
- xbee PRO S2C的多固件烧写
XBee and XBee-PRO ZB 嵌入式射频模块是与ZigBee/IEEE 802.15.4兼容的解决方案,可以满足低成本低功耗无线传感网络的特殊需求.该模块易于使用,极低的功耗,以及提供设备 ...
- linux系统下部署DNS正向解析
DNS服务概述: DNS(Domain Name System)域名系统,能够提供域名与IP地址的解析服务. 正向解析 正向解析是指域名到IP 地址的解析过程. 部署DNS正向解析 DNS服务的三个配 ...
- C语言内存四区的学习总结(一)---- 静态区
最近重新学习C语言相关知识,重新提到内存四区的概念,那么在之前的学习的基础上,在这儿做一个简单的总结与分享. 一.内存四区建立的流程 可以简单直观的查看下面的这个图片,直接的说明我们的程序在内存中是如 ...