码迷,mamicode.com
首页 > 其他好文 > 详细

hashlib模块

时间:2018-07-08 13:28:56      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:校验   固定   输入   ada   进制   读取   字符串   day   one   

为什么要加密?

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

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

#单位默认是字节
View Code

 

 

 




hashlib模块

标签:校验   固定   输入   ada   进制   读取   字符串   day   one   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!