(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循环时间会很长,为了减少读取时间,可以自己划分文件比例,有多少字节划分好,然后取几个点进行匹配就行

 

posted @ 2018-12-02 11:14  clyde_S  阅读(182)  评论(0编辑  收藏  举报