主要内容:
1 . hashlib 模块 : 摘要算法的模块
定义: 能够把一个字符串数据类型的变量转换成一个定长的密文的字符串,字符串里的每一个字符都是一个十六进制数字.
算法 : 对于同一个字符串,用相同的算法,相同的手段去进行摘要获得的值总是相同的.
a : md5 是一个算法, 32位的字符串 ,每个字符串都是一个十六进制.(效率高,算法相对简单)
import hashlib s = 'lilv' md5_obj = hashlib.md5() md5_obj.update(s.encode('utf-8')) re1 = md5_obj.hexdigest() print(re1)
b: sha1算法: 40位的字符串 , 每一个字符都是一个16进制.算法相对复杂,计算速度也慢.
md5_obj = hashlib.sha1() md5_obj.update(s1.encode('utf-8')) res = md5_obj.hexdigest() print(res,len(res),type(res))
c : 校验问题
文件的一致性校验:
md5_obj = hashlib.md5() with open('5.序列化模块_shelve.py','rb') as f: md5_obj.update(f.read()) ret1 = md5_obj.hexdigest() md5_obj = hashlib.md5() with open('5.序列化模块_shelve.py.bak','rb') as f: md5_obj.update(f.read()) ret2 = md5_obj.hexdigest() print(ret1,ret2)
d: MD5算法
登录的密文验证
字符串 --> 密文 , ,密文与字符串之间是不可逆的.
lily --->aee949757a2e698417463d47acac93df
s1 = '123456' md5_obj = hashlib.md5() md5_obj.update(s1.encode('utf-8')) res = md5_obj.hexdigest() print(res,len(res),type(res))
会出现数据库撞库的现象.黑客可以根据反推的方式推测出用户的密码,所以引入了加任意的盐.
加盐 # alex3714 d3cefe8cdd566977ec41566f1f11abd9 md5_obj = hashlib.md5('任意的字符串作为盐'.encode('utf-8')) md5_obj.update(s1.encode('utf-8')) res = md5_obj.hexdigest() print(res,len(res),type(res))
动态加盐的方式,即每个用户的一个属性作为盐,那么想要破解密码,每个用户都需要用一个库去比较,大大增加了破解所有账户的难度。
username = input('username : ') passwd = input('password : ') md5obj = hashlib.md5(username.encode('utf-8')) md5obj.update(passwd.encode('utf-8')) print(md5obj.hexdigest())
2. configparser模块
3. logginng模块
a : 功能 :日志格式的规范 ; 操作的简化 ; 日志的分级管理
b: 不能帮你做的事情 :自动生成你要打印的内容; 在哪些地方需要打印,要打印的内容是什么,内容的级别.
c : logging模块的使用 : 普通配置型 简单的 可定制性差
对象配置型 复杂的 可定制性强
d : 认识日志的分级: 默认打印123个
import logging logging.debug('debug message') # 调试模式 5 logging.info('info message') # 基础信息 4 logging.warning('warning message') # 警告 3 logging.error('error message') # 错误 2 logging.critical('critical message')# 严重错误 1
加了一个参数: leval = DEBUG全部显示.(可以输出屏幕)
import logging logging.basicConfig(level=logging.DEBUG) logging.debug('debug message') # 调试模式 logging.info('info message') # 基础信息 logging.warning('warning message') # 警告 logging.error('error message') # 错误 logging.critical('critical message')# 严重错误
写入文件
import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename='test.log') logging.debug('debug message') # 调试模式 logging.info('info message') # 基础信息 logging.warning('warning message') # 警告 logging.error('error message') # 错误 logging.critical('critical message')# 严重错误
e : basicConfig:不能将一个log信息既输出到屏幕 又输出到文件logger对象的形式来操作日志文件
import logging # 创建一个logger对象 logger = logging.getLogger() # 创建一个文件管理操作符 fh = logging.FileHandler('logger.log',encoding='utf-8') # 创建一个屏幕管理操作符 sh = logging.StreamHandler() # 创建一个日志输出的格式 format1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 文件管理操作符 绑定一个 格式 fh.setFormatter(format1) # 屏幕管理操作符 绑定一个 格式 sh.setFormatter(format1) logger.setLevel(logging.DEBUG) # logger对象 绑定 文件管理操作符 logger.addHandler(fh) # logger对象 绑定 屏幕管理操作符 logger.addHandler(sh)
4 functools 模块
偏函数partial
偏函数: 制定一个默认参数, 包装成另外一个参数.
print(int("10000", base=2)) print(int("1000", base=2)) print(int("100", base=2)) print(int("10", base=2)) # 可以写成下面的格式 int2 = partial(int, base=2) print(int2("10000")) print(int2("1000")) print(int2("100")) print(int2("10"))