11-19 hashlib模块

Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。

什么是摘要算法呢?

  摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。

摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。

 

sha 算法  随着算法复制程度成都的增加,摘要的时间和成本空间都会增加

摘要算法的作用
1、密码的密文存储
2、文件的一致性验证
在下载的时候,检查我们下载的文件和远程服务器上的文件是否一致
两台机器上的两个文件,你想检查这两个文件是否相等
摘要算法:包括一堆算法
import hashlib  #提供摘要算法的模块
md5 = hashlib.md5()    #使用了md5算法
md5 = hashlib.sha1()    #使用了sha1算法
md5.update(b'alex3714') #aee949757a2e698417463d47acac93df
print(md5.hexdigest())

说明:
    不管算法多么不同,摘要的功能始终不变
    对于相同的字符串,使用同一个算法进行摘要,得到的值总是不变的
    对于相同的字符串,使用不同的算法进行摘要,得到的值应该不同
    不管使用什么算法,hashlib的方式永远不变

做摘要计算,实质就是把字节类型的内容进行摘要处理
MD5方式:正常md5、加盐的、动态加盐的

例子:

#用户登录-----(用\n作为分隔符,容易出错,因为下面是以line来遍历的)
import hashlib
usename = input('输入名字:')
password = input('输入密码:')
md5 = hashlib.md5()
#生成加密串,其中 password 是要加密的字符串
md5.update(b'password')
#获取加密串
get_psd = md5.hexdigest()
with open('userinfo','w') as f:
    f.write(usename+'|')
    f.write(get_psd)
f.close()

#用户登录
import hashlib
usename = input('输入名字:')
password = input('输入密码:')
md5 = hashlib.md5()
#生成加密串,其中 password 是要加密的字符串
md5.update(b'password')
#获取加密串
getnew_psd = md5.hexdigest()
print(getnew_psd)
with open('userinfo') as f:
    for line in f:
        user,psd = line.split('|')
        if usename ==user and getnew_psd == psd:
            print('登录成功!')
        else:
            print('登录失败!')
            exit()
f.close()
摘要算法中加盐
import hashlib  #提供摘要算法的模块
md5 = hashlib.md5(bytes('salt',encoding='utf-8'))    #使用了md5算法
md5.update(b'alex3714') #aee949757a2e698417463d47acac93df
print(md5.hexdigest())  #29520817dd17b99ea7af32890f7698fb(和不加盐的结果不一样)

动态加盐

使用用户的一部分或者直接使用使用整个用户名作为盐
import hashlib  #提供摘要算法的模块
md5 = hashlib.md5(bytes('盐',encoding='utf-8')+b'123')    #使用了md5算法
md5.update(b'alex3714')
print(md5.hexdigest())  #28236e01d84bd2ecc7642c4e9b811845(结果不一样)

 

import hashlib
md5 = hashlib.md5()
md5.update('alex')
md5.update('3714')
print(md5.hexdigest)#得到的结果与不分开的一致,所以以后可以对字符串或者文件分开update

  

 

posted @ 2018-11-19 11:22  大脸猫12581  阅读(148)  评论(0编辑  收藏  举报