常见模块二
hashlib
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。
什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。
摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。
我们以常见的摘要算法MD5为例,计算出一个字符串的MD5值:
import hashlib md5=hashlib.md5() md5.update(b'alex3714') print(md5.hexdigest()) #利用hashlib方法将alex3714加密成了d26a53750bc40b38b65a520292f69306
注意:1、密码一旦被加密,无论程序运行多少次,那么结果依然保持一致;
2、密码一旦被加密,将无法由hash码重新转换为密码
应用,我们目前在注册一个账号和密码的时候,网站服务器接收到的用户名和密码就是以加密的形式存储,那么当我们忘记账号或者密码的时候,网站只能让我们充值密码,而不能直接发给我们密码,因为网站本身也不知道密码。
总结:
不管算法多么不同,摘要的功能始终不变:比如,当使用SHA1进行加密的时候只需要将MD5换成SHA1即可,其余代码不变。但是对于SHA而言,后面的数字越大,加密越复杂,安全系数越高,但是占用的内存也越大。
对于相同的字符串使用同一个算法进行摘要,得到的值总是不变
使用不同算法对相同的字符串进行摘要,得到的值应该不同
不管使用什么算法,hashlib的方法永远不变
摘要算法的应用:
密码的密文存储
文件的一致性验证
在下载文件的时候,检查我们下载的文件和远程服务器上的文件是否一致。比如有的网站上有一个软件,可能在下载的过程中由于网速的原因,下载不完全。那么这个时候就可以利用hashlib对整个文件进行检查如果本地下载的文件和远程服务器上的软件MD5一致,那么就表示下载完全。
两台机器上的两个文件,你想检查这两个文件是否相等
import hashlib usr=input('请输入您的用户名:') pwd=input('请输入您的密码:') with open('user_info') as f: for line in f: user,password=line.split('|') md5=hashlib.md5() md5.update(bytes(pwd,encoding='utf-8')) md5_pwd=md5.hexdigest() if usr==user and pwd==password: print('登录成功')
例如简单的‘1234’在被MD5加密后,在破解网站上也很容易被破解。那么通过加”盐“,能够进一步增加加密的强度。
import hashlib md5=hashlib.md5(bytes('salt',encoding='utf-8')) md5.update(b'1234') print(md5.hexdigest())
文件的一致性校验:不需要加盐。
一般对密码进行摘要加密的时候不需要拆开,但是如果是一个文件,文件的内容比较长,那么就需要拆开进行加密。
import hashlib md5=hashlib.md5() md5.update(b'alex') md5.update(b'3714') print(md5.hexdigest())#结果和没有拆开的alex3714一模一样
configparse
configparse是用来处理配置文件的模块
import configparser config=configparser.ConfigParser() config['default']={'ServerAliveInterval': '45', 'Compression': 'yes', 'CompressionLevel': '9', 'ForwardX11':'yes' } config['bitbucket.org'] = {'User':'hg'} config['topsecret.server.com'] = {'Host Port':'50022','ForwardX11':'no'} with open('example.ini', 'w') as f: config.write(f)
利用configparse查找文件
import configparser config = configparser.ConfigParser() #---------------------------查找文件内容,基于字典的形式 print(config.sections()) # [] config.read('example.ini') print(config.sections()) # ['bitbucket.org', 'topsecret.server.com'] print('bytebong.com' in config) # False print('bitbucket.org' in config) # True print(config['bitbucket.org']["user"]) # hg print(config['DEFAULT']['Compression']) #yes print(config['topsecret.server.com']['ForwardX11']) #no print(config['bitbucket.org']) #<Section: bitbucket.org> for key in config['bitbucket.org']: # 注意,文件中的DEFAULT是关键字,当应用for循环后,不仅打印出bitbucket.org下的内容,还能打印出DEFAULT下的内容 print(key) print(config.options('bitbucket.org')) # 同for循环,找到'bitbucket.org'下所有键 print(config.items('bitbucket.org')) #找到'bitbucket.org'下所有键值对 print(config.get('bitbucket.org','compression')) # yes get方法Section下的key对应的value
对文件的增删改查
import configparser config = configparser.ConfigParser() config.read('example.ini') config.add_section('yuan') config.remove_section('bitbucket.org') config.remove_option('topsecret.server.com',"forwardx11") config.set('topsecret.server.com','k1','11111') config.set('yuan','k2','22222') f=open('new2.ini', "w") config.write(f) f.close()
注意自己这里没有实现老师的功能。
logging
logging能实现以下几种常见功能
import logging logging.debug('debug message')#低级别的排错信息 logging.info('info message')#正常信息 logging.warning('warning message') logging.error('error message') logging.critical('critical message')
默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG),默认的日志格式为日志级别:Logger名称:用户输出消息。
import logging logging.basicConfig(level=logging.DEBUG,#basicConfig是简单配置 format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename='test.log', filemode='w') logging.debug('debug message')#低级别的排错信息 logging.info('info message')#正常信息 logging.warning('warning message') logging.error('error message') logging.critical('critical message')
logger对象配置
import logging logger=logging.getLogger()#创建一个对象 fh=logging.FileHandler('log.log',encoding='utf-8')#创建一个Handler对象,用来写入文件 sh=logging.StreamHandler()#创建一个屏幕控制对象 formatter=logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s') formatter2=logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s')#文件操作符和格式关联 fh.setFormatter(formatter) sh.setFormatter(formatter2)#logger对象和文件操作符关联 logger.addHandler(fh) logger.addHandler(sh) logging.debug('debug message')#低级别的排错信息 logging.info('info message')#正常信息 logging.warning('warning message') logging.error('error message') logging.critical('critical message')
利用上面的代码和basicConfig实现了同样的功能,但是代码更为复杂,这同样也使得功能的定制化更强。
总结:
有5种级别的日志记录模式
两种配置方式:basicconfig,log对象