hashlib和logging模块
hashlib模块
hashlib模块一般用于明文加密,其实就是一个自定义的字符编码表,只不过之前学习的是从0和1转换成字符,二现在是吧字符转换成另一种字符
hash是什么
hash是一种算法,该算法接受传入的内容,经过运算得到一串hash值
hash值的特点:
- 只要传入的内容一样,得到的hash值也一样,可以用于密码校验
- 不能用hash值返解成内容,可以保证安全性
- 只要使用的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模块最终结果一致,必须保证:
- hmac.new括号内指定的初始key一样
- 无论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模块中的四个角色
logger:产生对象的日志
通过logging.getLogger方法指定程序中的模块,然后赋值给loggerFilter:过滤日志的对象 Pass
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的日志等级低也只会记录高等级的信息'''