MD5先容
在写网络爬虫仿照上岸时,碰着提交表单时是一串数字和字母,才知道经由了md5加密。
MD5择要算法:(英语:MD5 Message-Digest Algorithm),一种被广泛利用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完全同等。MD5是最常见的择要算法,速率很快,天生结果是固定的128 bit字节,常日用一个32位的16进制字符串表示。

择要算法的运用:
任何许可用户登录的网站都会存储用户登录的用户名和口令。用户名和口令存到数据库表中。
name | password
--------+----------
chengf | 123456
code | abc999
如果以明文保存用户口令,如果数据库透露,所有用户的口令就落入黑客的手里。此外,网站运维职员是可以访问数据库的,也便是能获取到所有用户的口令。
精确的保存口令的办法是不存储用户的明文口令,而是存储用户口令的择要,比如MD5:
username | password
---------+---------------------------------
chengf | e10adc3949ba59abbe56e057f20f883e
code | 878ef96e86145580c38c87f0410ad153
当用户登录时,首先打算用户输入的明文口令的MD5,然后和数据库存储的MD5比拟,如果同等,解释口令输入精确,如果不一致,口令肯定缺点。这样纵然运维职员能访问数据库,也无法获知用户的明文口令。
02
hashlib先容
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加密
# @Time : 2020/6/1 21:50
# @Author : 编程技能圈
# @Site :
# @File : hash.py
# @Software: PyCharm
import 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为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'
- end -