Python hashlib模块中的md5加密

一、md5简介

md5 (Message-Digest Algorithm 5)模块用于计算信息密文(信息摘要)。 "message digests", 就是“信息摘要”的意思。

md5 对一段信息进行比较复杂的算法计算,生成一个128位的哈希值密文。md5 的生成过程比较复杂,主要分几大步骤,我们这里就不说生成原理了,搜索一下就可以了。

md5 是从md2, md4逐步演进而来的,两个不同的讯息计算得到相同的md5值(常称为“碰撞”)的可能性是非常低的,2的128次方分之一。所以 md5 可以被当作唯一值使用,类似于“指纹”。

当然,md5 已经被破解了,破解后可以很容易碰撞成功。不过,如果我们的使用场景不是那种高机密的场景,也不会有人来破解,那么我们可以放心的使用,并且md5是不可逆的,破解了也无法反解出我们的原始文件内容。

在Python2中,有一个模块就叫md5,现在也还可以使用,不过我们导入md5模块时,模块名上有一个中划线,说明现在已经不推荐使用md5模块了,Python3中已经废弃了。

Python将md5和sha两个模块整理成了一个模块,叫hashlib,兼容Python2和Python3,在Python2和Python3中都可以使用。

二、hashlib生成md5值

# coding=utf-8
import hashlib


md = hashlib.md5()
md.update('abcdef'.encode('utf-8'))
print(md.hexdigest())

运行结果:

e80b5017098950fc58aad83c8c14978e

通过初始化一个md5()实例,然后通过update()方法,传入要加密的内容(注意要先encode编码),然后通过md5对象的hexdigest()方法返回 md5 值。最终生成了字符串‘abcdef’的 md5 值,这是一个十六进制的字符串。

三、md5常用方法

import hashlib


md = hashlib.md5('abcdefg'.encode('utf-8'))
# print(dir(md))
print(md.hexdigest())
print(md.block_size)
print(md.name)
x = md.copy()
print(x.hexdigest())
print(x.name)
print("-" * 50)
print(md.digest())
print(md.digest_size)

运行结果:

7ac66c0f148de9519b8bd264312c4d64
64
md5
7ac66c0f148de9519b8bd264312c4d64
md5
--------------------------------------------------
b'z\xc6l\x0f\x14\x8d\xe9Q\x9b\x8b\xd2d1,Md'
16

除了可以通过update()方法传入需要加密的内容,也可以直接在初始化md5对象时传入需加密内容(也需要先编码)。

通过md5对象的block_size属性可以返回md5值的长度,name属性可以返回值的名字(默认叫md5)。

md5对象的copy()方法可以复制对象本身。复制结果与原对象相同。

如果不是通过hexdigest()方法,通过digest()方法返回的是二进制字符串,digest_size返回二进制字符串的长度。

四、hexdigest与digest的转换

import hashlib
import binascii

md = hashlib.md5('abcdefg'.encode('utf-8'))
print(md.hexdigest())
print(md.digest())
print("-" * 50)
print(binascii.hexlify(md.digest()).decode('utf-8'))
print(binascii.unhexlify(md.hexdigest()))

运行结果:

7ac66c0f148de9519b8bd264312c4d64
b'z\xc6l\x0f\x14\x8d\xe9Q\x9b\x8b\xd2d1,Md'
--------------------------------------------------
7ac66c0f148de9519b8bd264312c4d64
b'z\xc6l\x0f\x14\x8d\xe9Q\x9b\x8b\xd2d1,Md'

实现hexdigest与digest的转换,需要使用binascii模块的hexlify()和unhexlify()这两个方法。hexlify()将二进制结果转换成十六进制结果,unhexlify()反之。

 

 

Python hashlib模块中的md5加密_md5加密