【Python】hashlib模块实现MD5加密

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

MD5是一个安全的散列算法,输入两个不同的明文不会得到相同的输出值,根据输出值,不能得到原始的明文,即其过程不可逆。所以要解密MD5没有现成的算法,只能用穷举法,把可能出现的明文,用MD5算法散列之后,把得到的散列值和原始的数据形成一个一对一的映射表,通过比在表中比破解密码的MD5算法散列值,通过匹配从映射表中找出破解密码所对应的原始明文。

MD5算法具有以下特点:

1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
5、强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。

MD5算法使用的特性:

方便存储:MD5加密出来都是32位的字符串,能够给定固定大小的空间存储,传输,验证
文件加密:MD5算法运用在文件加密上很有优势,应为只需要32为字符串就能对一个巨大的文件进行验证完整性
不 可 逆:MD5加密出来只会截取末尾32位,具有良好的安全性,如果是对于参数加密很难伪造MD5
加密损耗低:MD5算法加密对于性能的消耗微乎其微(速度快)

MD5算法的实际应用

1.密码验证
可以当做密码验证,为了保证密码不在cmd5网站上破译,最好加盐及乱序,也可以只取一部分md5加密后的内容。md5是不可逆算法,只要保证算法不变,就能和数据库中的md5相匹配。
邮箱密码验证过程:首先用户创建邮箱时,邮件系统会对密码进行md5加密后存储到数据库,这个时候在数据库里面看到的密码是加密的,保证密码只能用户自己知道,减少密码泄漏的风险。
等到你登陆邮箱时,系统不是检验用户的密码,而是检验用户输入的密码经md5加密以后和数据库内加密密码进行对比,判断是否相等。

2.请求参数校验
对于服务器来来说,除了系统问题最大的问题就是害怕请求被拦截,拦截后修改参数后就会出现很多漏洞的可能性。
为了避免被拦截、参数被修改,常用方法就是对请求参数进行校验,就算拦截了请求参数并修改它,只要模拟不出MD5加密出来的值,服务器过滤器直接就会进行拦截。
校验过程:客户端通过http或者https请求服务器时,对其中的参数按约定的MD5加密方法生成一个token,服务器接收信息后按照同样的MD5加密方法生成一个值,然后对比客户端传过来的token进行对比,一致说明请求参数没有被修改。

3.版权验证
当一个视频或者音频创作出来的时候它的md5是唯一的,若以后有翻录等版本出来,即使画质,声音,文件名都一样,但是他们的md5验证是不一样的,所以可以验证版权。
还比如用某一账户下载的视频它的账户信息也会和视频一起md5操作,如果以后这个人私自传播通过md5就可以去数据库中查找泄露版权的情况。

4.文件上传
文件上传时会上传文件的信息,此时将文件的md5上传,服务器中存储这个md5值,并存储这个md5值所对应的已上传字节长度,比如未上传对应为0,已上传对应为-1,已上传200字节就对应200,这个上传的时候可以匹配到这个文件在服务器中的状态,方便做断点续传,只要源文件没有更改,即使换个名字,换个账户都可以在服务器找到对应的文件,所以当服务器中有已经上传完毕的此文件时,别人再上传这个文件就可以实现秒传。

Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。
摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
在python3的标准库中,已经移除了md5模块,而关于hash加密算法都放在hashlib这个标准库中,如SHA1、SHA224、SHA256、SHA384、SHA512和MD5算法等。
具体代码实现:

import hashlib
import time

encode = 'utf-8'                        # 编码
appkey = 'md5test.'                     # 待加密信息

time_span = str(int(time.time()))
o_token = appkey                            # 可以对o_token进行处理appkey+time_span
hl = hashlib.md5()                          # 创建md5对象
hl.update(o_token.encode(encoding=encode))  # 转换为bytes
token = hl.hexdigest().upper()              # hexdigest() 加密过程
print('第一种MD5加密后为 :' + token)

# 另一种写法:b前缀代表的就是bytes
str_md5 = hashlib.md5(b'md5test.').hexdigest().upper()
print('第二种MD5加密后为 :' + str_md5)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章