为什么要加密?
随着互联网的普及,登录操作变得越来越普遍,但是如果我们输入密码的时候是明文的话,容易被人窃取。
进而,对数据加密是非常必要的,这里就引入了hashlib模块
hashlib模块下面的算法有很多,目前使用比较广泛的是 MD5和SHA1
什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。
请看下面的例子
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import hashlib md5_obj=hashlib.md5() with open('s1.log','r',encoding='utf-8') as f: content=f.read().encode('utf-8') md5_obj.update(content) print(md5_obj.hexdigest()) #fa859ea839c444efc1feee5327103c38 # import hashlib # md5_obj=hashlib.md5() # with open('s1.log','rb') as f: # content=f.read() # md5_obj.update(content) # print(md5_obj.hexdigest()) #540c5ca82bb622a20dd99cd5fe278015 #上面的两种方式得到的结果都不一样,可见以rb模式读取和读取后得到的结果是不一样的 # 但是在update的时候必须是bytes类型, #要不然报错:TypeError: Unicode-objects must be encoded before hashing
上面例子中 打印md5_obj,又是什么呢
print(md5_obj,type(md5_obj)) #<md5 HASH object @ 0x000001772376A468> <class '_hashlib.HASH'>
还可以给算法预先加一个字符串
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import hashlib m = hashlib.md5('wahaha'.encode('utf-8')) #加盐 m.update('123456'.encode('utf-8')) print(m.hexdigest())
算法的特点:
# 第一 使用相同的算法对同一个字符串进行摘要
# 在任意时刻 任意平台 任意语言结果总是不变的
# 第二 这个摘要过程不可逆
# 第三 对于不同的数据的计算结果总是不同的
如果把要摘要的字符串分开会怎么样呢
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# import hashlib # md5_obj=hashlib.md5() # md5_obj.update('你好,刘'.encode('utf-8')) # print(md5_obj.hexdigest()) #c396995a0f9daee0a858804c1a256c3e import hashlib md5_obj=hashlib.md5() md5_obj.update('你好,'.encode('utf-8')) md5_obj.update('刘'.encode('utf-8')) print(md5_obj.hexdigest()) #c396995a0f9daee0a858804c1a256c3e #从上面两个例子可以看出,对字符串进行分段update,它们的摘要结果是一样的
进而考虑到以后要对一个大的文件进行摘要就没必要全部读到内存,可以分开upadate,最后hexdigest
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
校验文件一致性 import os import hashlib def get_md5(file,n = 10240): with open(file, 'rb') as f1: md5_obj = hashlib.md5() file_size = os.path.getsize(file) while file_size>0: md5_obj.update(f1.read(n)) file_size -= n return md5_obj.hexdigest() def compare(file1,file2): return get_md5(file1) == get_md5(file2) print(compare(r'E:\S22\day9\3.正则模块.py',r'E:\S22\day9\3.正则模块.py.bak')) #单位默认是字节