hashlib模块
hashlib模块
1、hashlib模块简介
'''
加密:所谓的加密就是通过一系列的算法将明文数据转化为加密数据,
目的是为了数据的安全性
python里hashlib提供了几种常见的摘要算法,如MD5,SHA1等
而所谓的摘要算法就是通过摘要函数对任意长度的数据计算出固定长度的摘要,
目的是为了发现原始数据是否被篡改过
摘要算法这里我们成为加密算法
常见的加密算法有:md系列,sha系列,base系列,hmac系列
'''
# hashlib模块的使用
# 1、导入模块
import hashlib
# 2、确定算法类型(这里以md5为例),md5也是我们使用比较多的
# md5 = hashlib.md5()
# 3、将明文数据传递给md5算法(注意:update只能接受bytes类型的数据)
# md5.update(b'hello123')
# 4、获取加密后的数据
# res = md5.hexdigest()
# print(res) # 7e072335a07341e83d8e97de5a87f35a
import time
'''
1、加密后的数据是没有办法反解密成明文的
网站上一些所谓的解密,其实就是提前计算出一系列明文对应的密文
之后对比密文再获取明文
'''
2、hashlib模块的几个要点
hashlib的相关要点介绍
- 1.只要明文数据是相同的,无论如何传递结果都是一样的
import hashlib
import time
md5 = hashlib.md5()
md5.update(b'123')
md5.update(b'hello')
md5.update(b'hello123')
res = md5.hexdigest()
print(res) # 7e072335a07341e83d8e97de5a87f35a
- 2.密文数据越长表示其内部对应的算法越复杂,破解的难度就越大
import hashlib
import time
# 1、先确定算法类型
md5 = hashlib.sha256()
# 2、将明文数据传递给算法
md5.update(b'hello123')
# 3、获取加密后的数据(一串没有规则的一串字符串)
res = md5.hexdigest()
print(res) # 27cc6994fc1c01ce6659c6bddca9b69c4c6a9418065e612c69d110b3f7b11f8a
'''
密文越复杂,其内部相对应的算法就越复杂,在计算的时候,
占用的资源就越多,密文越长,基于网络传输需要占用的数据也就越大
具体使用什么算法取决于项目的需求,不过一般md5就足够了
'''
- 3.加盐处理
import hashlib
import time
# 只要涉及到用户的登录密码存储,一般都是加密处理,只有用户自己知道明文是什么
'''
1、程序员无法知道用户的登录密码明文
2、即使数据泄露了也无从得知明文数据
'''
import hashlib
import time
'''
所谓的加盐处理,就是在对明文数据进行加密处理之前,添加一些干扰项,
使得真正的明文数据更难以被破解
'''
# 1、先确定算法类型
md5 = hashlib.md5()
# 2、将明文数据添加到算法中
# 加盐(加入干扰项)
md5.update('公司内部自己定义的盐'.encode('utf8'))
# 真实数据
md5.update(b'hello123')
# 3、获取加密后的数据
res = md5.hexdigest()
print(res) # 8576a798bbba7d40e5c05cd7bb6a3f59
'''
加密后的数据是一串无规则的随机字符串,且只要是一个字符的变化,加密后的数据就完全不同
'''
- 4、动态加盐
'''
动态加盐简单来说就是加的盐是一个变化值,每次获取的密文都不一样
使得真实的明文数据被破解的难度加大
'''
# 1、先确定算法类型
md5 = hashlib.md5()
# 2、将明文数据添加到算法中
# 动态加盐(加入干扰项)
res = str(time.time())
md5.update(res.encode('utf8'))
# 真实数据
md5.update(b'hello123')
# 3、获取加密后的数据
res = md5.hexdigest()
print(res) # 2fe42fc30e8bfec265b9c530afb4fc79
"""
在IT互联网领域 没有绝对的安全可言 只有更安全
原因在于互联网的本质 就是通过网线(网卡)连接计算机
"""
- 5、检验文件的一致性
import hashlib
import time
'''
当对一个文件内的全部数据进行加密时,文件较小时,可以这样使用,
但是当文件很大时,全部加密会大大增加消耗的资源,这时候就要采用
对文件进行切片读取加密的方式
'''
# 这里以一个txt文件为例
# 先确定加密算法
md5 = hashlib.md5()
# 1、我们先采用加密的方式读取原始文件里的内容
with open(r'a.txt','rb') as f:
for line in f:
# 把明文数据传入加密算法中
md5.update(line)
real_date = md5.hexdigest()
print(real_date) # fecab593c819e44dabca8df49c067beb
# 2、对原始文件进行修改后再进行加密读取
# 确定加密的算法
md5 = hashlib.md5()
with open(r'a.txt','rb') as f:
for line in f:
# 将明文数据传入到加密算法中
md5.update(line)
real_date = md5.hexdigest()
print(real_date) # 15771314a8de5e439dd0426ff7beb818
'''
从上面两个案例我们可以看到,文件修改前后的加密数据差距很大,
我们一般在网络上下载的文件,都是经过加密处理以后的,当我们下载后,
再利用形同的算法进行加密处理随后和文件之间的加密数据进行比对,如果不一样,
就说明文件有被修改的迹象,也就是我们平时在下载软件时会遇到警告的原因
'''
# 下面再来说一下,当我们要进行加密的文件数据较大时,如何采用切片获取数据进行加密
import os
# 1、读取文件的大小
size = os.path.getsize(r'a.txt')
# 2、指定切片读取的策略(读取几段,每段读取几个字节)
read_method = [0, size // 4, size // 2, size]
'''
了解知识:
比特流技术
断点续传技术
'''