hashlib模块

为什么要加密?

随着互联网的普及,登录操作变得越来越普遍,但是如果我们输入密码的时候是明文的话,容易被人窃取。

进而,对数据加密是非常必要的,这里就引入了hashlib模块

hashlib模块下面的算法有很多,目前使用比较广泛的是 MD5和SHA1

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

摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。

请看下面的例子

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
View Code

上面例子中 打印md5_obj,又是什么呢

print(md5_obj,type(md5_obj)) #<md5 HASH object @ 0x000001772376A468> <class '_hashlib.HASH'>

还可以给算法预先加一个字符串

import hashlib
m = hashlib.md5('wahaha'.encode('utf-8')) #加盐
m.update('123456'.encode('utf-8'))
print(m.hexdigest())
View Code

算法的特点:

# 第一 使用相同的算法对同一个字符串进行摘要
# 在任意时刻 任意平台 任意语言结果总是不变的
# 第二 这个摘要过程不可逆
# 第三 对于不同的数据的计算结果总是不同的

 如果把要摘要的字符串分开会怎么样呢

# 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,它们的摘要结果是一样的
View Code

进而考虑到以后要对一个大的文件进行摘要就没必要全部读到内存,可以分开upadate,最后hexdigest

 校验文件一致性
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:S22day93.正则模块.py',r'E:S22day93.正则模块.py.bak'))

#单位默认是字节
View Code



原文地址:https://www.cnblogs.com/mmyy-blog/p/9279681.html