zoukankan      html  css  js  c++  java
  • 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



  • 相关阅读:
    补习系列(4)-springboot 参数校验详解
    华为鲁勇:5G+云+AI三大核心引擎将驱动广州数字经济发展
    selenium firefox
    徐翔之后新生代“敢死队”浮出水面:八年一万倍
    ActiveMQ讯息传送机制以及ACK机制
    一元线性回归分析及java实现
    jsoup -- xml文档解析
    HDU 1020 Encoding 字符串
    PHP缓存之文件缓存
    Eclipse PHPEclipse 配置
  • 原文地址:https://www.cnblogs.com/mmyy-blog/p/9279681.html
Copyright © 2011-2022 走看看