Day 18 常用模块part2

hashlib和logging模块

hashlib模块

hashlib模块一般用于明文加密,其实就是一个自定义的字符编码表,只不过之前学习的是从0和1转换成字符,二现在是吧字符转换成另一种字符

hash是什么

hash是一种算法,该算法接受传入的内容,经过运算得到一串hash值

hash值的特点:

  1. 只要传入的内容一样,得到的hash值也一样,可以用于密码校验
  2. 不能用hash值返解成内容,可以保证安全性
  3. 只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度时固定的,可以用于对文本的哈希处理
import hashlib

m=hashlib.md5()     #第一步:使用MD5算法,赋值给一个变量名m

'''第二步:使用m下面的update方法传入要hash的内容,多次update会把内容拼接起来'''
m.update(b'hello')      #接受二进制的数据
m.update('hello'.encode('utf8'))        #接受字符编码形式的数据

res=m.hexdigest()   #使用hexdigest方法得到hash的结果
print(res)


'''res1和res2输出的hash值是一样的'''
m1=hashlib.md5()
m1.update(b'hello')
m1.update(b'world')
res1=m1.hexdigest()
print(res1)

m2=hashlib.md5()
m2.update(b'helloworld')
res2=m2.hexdigest()
print(res2)

撞库破解hash算法加密

本质上就是吧 用户可能设置的密码放入一个列表中,通过循环取值将列表元素取出来进行hash算法,把获得的值和用户密码对应的hash值进行比较,从而获得用户真正的密码

为了防止密码撞库,可以使用python中的hmac模块,他内部对我们创建key和内容经过某种处理后在加密

如果要保证hmac模块最终结果一致,必须保证:

  1. hmac.new括号内指定的初始key一样
  2. 无论update多少次,校验的内容累加到一起的内容是一样的
import hmac

'''hmac模块只接受二进制数据的加密'''
h1=hmac.new(b'hmac')
h1.update(b'hello')
h1.update(b'world')
res1=h1.hexdigest()
print(res1)

h2=hmac.new(b'hmac')
h2.update(b'helloworld')
res2=h2.hexdigest()
print(res2)

h3=hamc.new(b'hmachelloworld')
res3=h3.hexdigext()
print(res3)

'''由于h1和h2中 hmac.new中的key是一样的,所以只要后续update内容累加起来是一样的,最终输出的hash值也是一样的,h3中hmac.new中的key值和h1h2都不一样,所以最终输出的hash值也不一样,所以在使用hmac做密码加盐的时候,不能将需要加密的内容放到hmac.new的key中,而是要放到update中去'''

logging模块

用于记录日志(程序的相关信息)

logging模块的五个级别

debug:调试信息:10
info:正常信息:20
warning:警告信息:30
error:错误信息:40
critical:严重错误信息:50

在设置日志记录格式的时候可以设置日志级别,可选参数为10,20,30,40,50,表示只会打印或保存该等级以上的日志级别信息信息,默认级别为30,即只会记录warning,error和critical级别的日志

logging模块中的四个角色

  1. logger:产生对象的日志
    通过logging.getLogger方法指定程序中的模块,然后赋值给logger

    扫描二维码关注公众号,回复: 6415560 查看本文章
  2. Filter:过滤日志的对象 Pass

  3. Handler:接收日志然后控制打印到不同的地方,FileHandler用来打印到文件中,StreamHandler用来打印到终端

4.Formatter:可以钉子不同的日志格式,然后绑定给不同的Handler对象使用,一次来控制不同的Handler的日志格式

import logging

'''第一步:设定一个日志对象用来产生日志'''
logger=logging.getLogger(__file__)


'''设定多个Handler,明确保存方式(文件或终端)'''
h1=logging.FileHandler('log1.log')  #保存到文件
h2=logging.FileHandler('log2.log')  #保存到文件
S1=logging.StreamHandler()          #打印到终端显示


'''设定多个Formatter日志格式,用来绑定给Handler,一个日志格式可以绑定给多个Handler'''
formatter1=logging.Formatter(日志格式1)
formatter2=logging.Formatter(日志格式2)


'''为Handler对象绑定Formatter日志格式'''
h1.setFormatter(formatter1)
h2.setFormatter(formatter2)
s1.setFromatter(formatter1)


'''把Handler对象添加给logger'''
logger.addHandler(h1)
logger.addHandler(h2)
logger.addHanfler(s1)

'''设置日志级别,有两个筛选条件,第一个是logger,第二个是handler'''
logger.setLevel(30)
h1.setLevel(10)
h2.setLevel(40)
s1.setLevel(40)
'''只有经过logger过滤后的日志才会到handler继续过滤,也就是说如果logger的过滤级别比handler高,则就算handler的日志等级低也只会记录高等级的信息'''

猜你喜欢

转载自www.cnblogs.com/masterjian924/p/11004778.html