Python3中的md5加密

md5介绍

在写网络爬虫模拟登陆时,遇到提交表单时是一串数字和字母,才知道经过了md5加密。

这里写图片描述
md5加密的密码

MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。

摘要算法的应用

任何允许用户登录的网站都会存储用户登录的用户名和口令。用户名和口令存到数据库表中。

name    | password
--------+----------
michael | 123456
bob     | abc999

如果以明文保存用户口令,如果数据库泄露,所有用户的口令就落入黑客的手里。此外,网站运维人员是可以访问数据库的,也就是能获取到所有用户的口令。

正确的保存口令的方式是不存储用户的明文口令,而是存储用户口令的摘要,比如MD5:

username | password
---------+---------------------------------
michael  | e10adc3949ba59abbe56e057f20f883e
bob      | 878ef96e86145580c38c87f0410ad153

当用户登录时,首先计算用户输入的明文口令的MD5,然后和数据库存储的MD5对比,如果一致,说明口令输入正确,如果不一致,口令肯定错误。这样即使运维人员能访问数据库,也无法获知用户的明文口令。

hashlib介绍

Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。

摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

在python3的标准库中,已经移除了md5模块,而关于hash加密算法都放在hashlib这个标准库中,如SHA1、SHA224、SHA256、SHA384、SHA512和MD5算法等。

python3的hashlib官方文档(英文)

使用hashlib库进行md5加密

# 由于MD5模块在python3中被移除
# 在python3中使用hashlib模块进行md5操作

import hashlib

# 待加密信息
str = 'this is a md5 test.'

# 创建md5对象
m = hashlib.md5()

# Tips
# 此处必须encode
# 若写法为m.update(str)  报错为: Unicode-objects must be encoded before hashing
# 因为python3里默认的str是unicode
# 或者 b = bytes(str, encoding='utf-8'),作用相同,都是encode为bytes
b = str.encode(encoding='utf-8')
m.update(b)
str_md5 = m.hexdigest()

print('MD5加密前为 :' + str)
print('MD5加密后为 :' + str_md5)

# 另一种写法:b‘’前缀代表的就是bytes
str_md5 = hashlib.md5(b'this is a md5 test.').hexdigest()
print('MD5加密后为 :' + str_md5)

运行结果

这里写图片描述
英文加密,可以使用b' '前缀。

如果要对中文加密,使用b' '前缀来写会报错,原因在于字符转码问题,b' '在python中只能对ASCII字符进行转码。

这里写图片描述
要用encode(encoding='utf-8')将中文转码成UTF-8:

>>> import hashlib
>>> data = '你好'
>>> hashlib.md5(data.encode(encoding='UTF-8')).hexdigest()
'7eca689f0d3389d9dea66ae112e5cfd7'

其它中文编码md5加密

可以看到GBK、GB2312、GB18030编码的加密结果相同,而与UTF-8的加密结果不同。

>>> hashlib.md5('你好'.encode(encoding='UTF-8')).hexdigest()
'7eca689f0d3389d9dea66ae112e5cfd7'

>>> hashlib.md5('你好'.encode(encoding='GBK')).hexdigest()
'b94ae3c6d892b29cf48d9bea819b27b9'

>>> hashlib.md5('你好'.encode(encoding='GB2312')).hexdigest()
'b94ae3c6d892b29cf48d9bea819b27b9'

>>> hashlib.md5('你好'.encode(encoding='GB18030')).hexdigest()
'b94ae3c6d892b29cf48d9bea819b27b9'

关于每个方法的解析,可以参考:

CSDN:python3中的md5加密

关于python编码、encode、decode的内容,可以参考:

廖雪峰python教程:字符串和编码

CSDN:python中的encode()和decode()函数

CSDN:python3大作战之encode与decode讲解

参考链接

CSDN:Python之MD5加密

CSDN:python3中的md5加密

廖雪峰python教程:hashlib

你可能感兴趣的:(python,python,md5)