python学习笔记 day28 hashlib(二)

1.hashlib 是一个提供很多摘要算法的模块;

其实我们在使用摘要算法进行加密时,可以有三种方式:

1. 普通加密:

import hashlib
md5=hashlib.md5()  # 使用md5摘要算法进行加密
md5.update(bytes("xuanxuan",encoding='utf-8'))
print(md5.hexdigest())

运行结果:

但是其实对于一些特别简单的密码,比如123456 直接使用上面的md5摘要算法进行加密时,是很容易被破解的,就是有一群很无聊的人,会去把很多简单的字符串使用md5摘要算法加密之后的结果放到一个库中,然后当你来一个对简单密码进行md5摘要算法加密的结果,就会把这个结果和库进行比对,从而还原用户输入的明文密码,专业点也叫撞库

于是:

2. 摘要算法加密的第二种方式----加盐:

import hashlib
md5_salt=hashlib.md5(bytes("加盐(当然你也可以写其他的字符,俗称加盐)",encoding='utf-8'))  # 加盐操作
md5=hashlib.md5()  # 这里就没有加盐
md5.update(bytes("xuanxuan",encoding='utf-8'))
md5_salt.update(bytes("xuanxuan",encoding='utf-8'))  # md5.update()中的内容才是真正需要加密的内容;
print(md5_salt.hexdigest())  # 加盐之后再对字符串xuanxuan使用md5摘要算法进行加密的结果
print(md5.hexdigest())  # 未加盐操作,对字符串xuanxuan进行md5加密之后的结果

运行结果:

 3. 动态加盐

但其实上面那种方式也不是最安全的,,,我们可以采用动态加盐的方式,对所需加密的字符串使用摘要算法动态加密;比如用户在注册时,需要输入用户名和密码,我们在对密码使用摘要算法进行加密是就可以动态加盐,就是把用户名或者用户名的一部分作为“盐”:当然在我们进行用户登录验证时,也需要使用相同的动态加盐方式对用户登录时输入的密码进行加密,这样才能比较~

import hashlib
# 使用动态加盐方式模拟用户注册,把用户名和加密后的密码写入文件
username=input("username>>>")
password=input("password>>>")
with open("info1",'w',encoding='utf-8') as file:
    md5=hashlib.md5(bytes(username,encoding='utf-8'))  # 动态加盐,使用用户名加盐
    md5.update(bytes(password,encoding='utf-8'))    # 这才是对密码进行加密
    md5_salt=md5.hexdigest()
    file.writelines((username,"|",md5_salt))  # 把用户名和动态加盐方式加密后的密码写进文件
print("对用户注册的密码使用用户名作为加盐方式动态加密的密码:",md5_salt)
# 模拟用户登陆,将密码使用相同的动态加盐方式加密,将加密后的结果和原来存入文件时的加密后的密码进行比对
usm=input("username:")
pwd=input("password:")
with open("info1",'r',encoding='utf-8') as file:
    for line in file:
        username,password=line.split("|")   # 存入文件的用户名和密码(使用动态加盐加密的)
        md5=hashlib.md5(bytes(usm,encoding='utf-8'))  # 使用相同的动态加盐方式
        md5.update(bytes(pwd,encoding='utf-8'))  # 对输入的密码进行加密
        md5_salt=md5.hexdigest()
        print("对用户登录输入的密码使用用户名作为加盐方式动态加密的密码:",md5_salt)
        if username==usm and password==md5_salt:
            print("登录成功")
        else:
            print("登录失败")

运行结果:

2. hashlib的md5摘要算法在对密码等进行加密时(使用update)可以多次update

import hashlib
md5=hashlib.md5()
md5.update(bytes("xuan",encoding='utf-8'))
md5.update(bytes("xuan",encoding='utf-8'))  #对同一个字符串xuanxuan 分两次update,每次只update一部分
print(md5.hexdigest())

md5_2=hashlib.md5()
md5_2.update(bytes("xuanxuan",encoding='utf-8'))  # 和对xuanxuan字符串进行一次update
print(md5_2.hexdigest())

运行结果:

所以对同一个字符串进行一个update 和拆开每次只update其中的一部分,分多次update得到的加密后的结果是一样的~

我们在进行文件一致性校验时,因为文件太大,就可以每次都一部分,把读到的一部分进行update,然后分多次update,跟一下读所有内容(字符串)进行一次update加密后的结果是一样的~

3. 对一个文件进行多次摘要算法,多次update计算出这个文件的md5值

import hashlib
md5=hashlib.md5()  # 得到一个使用md5摘要算法的对象md5
with open("info",'r',encoding='utf-8') as file:
    for line in file:   # 每次只读一行,然后对一行内容(字符串)进行update ,分多次update 和把文件所有内容一下读出来进行一次update得到的加密后的结果是一样的
        if line:
            print(line.strip())  # 打印每一行的内容
            md5.update(bytes(line.strip(),encoding='utf-8'))  # md5对象不断调用update方法,一行一行读文件内容,一行一行update加密(算上之前读到的内容一起加密)
            print(md5.hexdigest())  # 到此行为止(算上前面读到的内容)读到的文件中内容的加密方式
print(md5.hexdigest())  # 将多次update()后的加密结果打印(其实得到的是整个文件的md5值)

运行结果:

talk is cheap,show me the code
原文地址:https://www.cnblogs.com/xuanxuanlove/p/9703889.html