dawn-liu

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

为什么要加密?

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

进而,对数据加密是非常必要的,这里就引入了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:\S22\day9\3.正则模块.py',r'E:\S22\day9\3.正则模块.py.bak'))

#单位默认是字节
View Code

 

 

 




posted on 2018-07-08 12:16  dawn-liu  阅读(255)  评论(0编辑  收藏  举报