码迷,mamicode.com
首页 > 编程语言 > 详细

python 操作 MD5

时间:2019-04-14 16:28:52      阅读:205      评论:0      收藏:0      [点我收藏+]

标签:组成   tool   length   登陆   编程语言   演讲   crypto   是什么   create   

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)```

二: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 表示十六进制数据字符串值

#permutations
for
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

标签:组成   tool   length   登陆   编程语言   演讲   crypto   是什么   create   

原文地址:https://www.cnblogs.com/moying-wq/p/10705177.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!