zoukankan      html  css  js  c++  java
  • (2)hashlib模块(加密算法模块)

    hash算法模块内有很多种,如md5、sha1等,只是加密的程度不一样

    hash是一种算法

    该算法接收传入的文本内容,经过hash运算得到一串hash值

    hash值具备三个特点:

    1. 如果传入的内容相同,得到hash一定相同

    2. 不能根据hash值反推出内容(无法反解,但是目前已被破解)

    3. 如果采用hash算法固定,那么hash值的长度也是固定的,即不会随着内容的增多而变长

    结合1+3===>文件完整性校验(网络传输中有可能应为网络问题丢失部分数据

    PS:如何做呢,用hash算法将文件生成一个hash值,用户下载后也hash一次得到的值对比一样就是完整的(服务端用什么hash算法,客户端也要用相同算法)

    结合1+2===>传输密文密码(传输过程中避免被黑客抓包盗取账户

    PS:如何做呢,用户在客户端注册账户密码时候会生成一个hash值,然后存入服务端,以后用户登录只要输入账号密码就会生成hash值,然后匹配服务端的hash即可

    hashlib模块实例

    import hashlib

    m=hashlib.md5() #定义hashlib的加密算法种类

    m.update('你好啊'.encode('utf-8')) m.update('hello'.encode('utf-8'))

    print(res) #36b20ffdd2e10c6feef8ca866f2ef3b2

    print(len(res)) #36b20ffdd2e10c6feef8ca866f2ef3b2 #算法固定长度固定,即不同的算法长度一不一样

    PS:update可以多次传入值(一次hash动作,不管传入多少只,得到的hash值只有一个)

    PS:传入的内容相同即得到的hash值也肯定相同

    PS:用update方法将值传入,但是必须传入bytes类型,而且用encode编码定义成指定编码格式(图片等任何转成二进制类型都可传入)

    如果传入的内容相同,得到hash一定相同

    m.update('你'.encode('utf-8'))

    m.update('好啊h'.encode('utf-8'))

    m.update('ello'.encode('utf-8'))

    res=m.hexdigest()

    print(res) #36b20ffdd2e10c6feef8ca866f2ef3b2

    print(len(res)) #36b20ffdd2e10c6feef8ca866f2ef3b2

    PS:不管原值如何拆分传入,得到的hash值依旧一样不会变,所以只要原值不变,hash一定不会变

    PS:hexdigest()这个方法就是用来得到hash值

    密码校验(加盐操作,防止撞库破解)

    pwd=input('>>>: ').strip()

    m=hashlib.md5()

    m.update('天王盖地虎'.encode('utf-8')) #这个位置就是加盐操作

    m.update(pwd.encode('utf-8')) #这个位置是用户输入内容

    m.update('小鸡炖蘑菇'.encode('utf-8')) #这个位置就是加盐操作

    print(m.hexdigest()) #hexdigest得到hash值

    文件完整性校验

    m=hashlib.md5()

    with open('f.txt',mode='rb') as f:

    for line in f: #读取文件用for循环,减小内存压力

      f.seek(100,0) #光标用seek从头开始往后移动100个字节

      x = f.read(5) #读取光标位置后5个字节的内容

      m.update(x) 

    hash_v=m.hexdigest()

    print(hash_v) #一行行读加起来得到的hash值就是一样的

    PS:文件过大,for循环时间会很长,为了减少读取时间,可以自己划分文件比例,有多少字节划分好,然后取几个点进行匹配就行

  • 相关阅读:
    7、8月刷题总结
    【POJ】2828 Buy Tickets(线段树+特殊的技巧/splay)
    [LeetCode] 459. Repeated Substring Pattern 重复子字符串模式
    [LeetCode] 268. Missing Number 缺失的数字
    [LeetCode] 190. Reverse Bits 翻转二进制位
    [LeetCode] 275. H-Index II H指数 II
    [LeetCode] 274. H-Index H指数
    [LeetCode] 387. First Unique Character in a String 字符串的第一个唯一字符
    [LeetCode] 415. Add Strings 字符串相加
    [LeetCode] 220. Contains Duplicate III 包含重复元素 III
  • 原文地址:https://www.cnblogs.com/shizhengquan/p/10052539.html
Copyright © 2011-2022 走看看