32位md5解密_Python3中的md5加密实现

论坛 期权论坛 脚本     
已经匿名di用户   2022-5-29 19:05   614   0

01

MD5介绍

4a5639311526b0ff0b824544cf3fb528.png b6821cf3d2fbc7da8d62ba7f128db775.png

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

9443b0d144da62674f50d93daf101594.png

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

摘要算法的应用:

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

name | password--------+----------chengf | 123456code | abc999

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

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

username | password---------+---------------------------------chengf | e10adc3949ba59abbe56e057f20f883ecode | 878ef96e86145580c38c87f0410ad153

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

02

hashlib介绍

224635d2888e600acfa13f030bb28f39.png 0cedc14ca33787f8adb6a9c9bffc03ab.png

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

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

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

https://docs.python.org/3/library/hashlib.html?highlight=hashlib#credits

03 使用hashlib库进行md5加密

8c39fed58ae4dbd2f99b9532c5a020c5.png f6fb169bfde6453112932514944e8092.png
# @Time : 2020/6/1 21:50# @Author : 编程技术圈# @Site : # @File : hash.py# @Software: PyCharmimport hashlib# 由于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为bytesb = str.encode(encoding='utf-8')m.update(b)str_md5 = m.hexdigestprint('MD5加密前为 :' + str)print('MD5加密后为 :' + str_md5)# 另一种写法:b‘’前缀代表的就是bytesstr_md5 = hashlib.md5(b'this is a md5 test.').hexdigestprint('MD5加密后为 :' + str_md5)

运行结果

1bc9a189ad83bbed7e705f8538ba2e0e.png

注:对英文加密,可以使用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'

- end -

7b55daeb659e9ec6087a5b3bc48ab187.png
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:81
帖子:4969
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP