python 22 days
python 22 days
hashlib模块、configparser模块、logging模块
hash()
把一个数据转换成一个数字的算法
在同一次执行的过程中,
对同一个可hash的值进行计算得出的结果总是相同的
做什么用的?
有什么特点?
基础数据类型的时候
不可变数据类型可hash
可变数据类型不可hash
在同一次执行的过程中,
对同一个可hash的值进行计算得出的结果总是相同的
做什么用的?
有什么特点?
基础数据类型的时候
不可变数据类型可hash
可变数据类型不可hash
print(hash('abc')) #-2148338516684256523 print(hash('abc')) print(hash('abc')) print(hash('abc'))
-6430976884502984568
-6430976884502984568
-6430976884502984568
-6430976884502984568
结果是可变的
字典
集合
在数据的存储方面提供优化的
为什么对同一个值计算hash值每次运行结果不同??
由于每一次执行所获得的存储空间都不一定相同。
所以多次执行统一代码得到的hash值可能不同
hashlib的模块:
hashlib的特点
是一个模块 ,提供多种算法
同一个字符串用同一种算法进行加密,结果总是相同的
同一个字符串用不同的算法进行加密,结果总是不同的
是一个模块 ,提供多种算法
同一个字符串用同一种算法进行加密,结果总是相同的
同一个字符串用不同的算法进行加密,结果总是不同的
那为什么要使用hashlib进行加密呢?
1. 登录
alex3714 --> 转换 --> 转换之后的结果储存在文件里
# 用户登录的时候
输入密码--> 用同样的方法转换 -->结果于文件中的匹配
1. 登录
alex3714 --> 转换 --> 转换之后的结果储存在文件里
# 用户登录的时候
输入密码--> 用同样的方法转换 -->结果于文件中的匹配
import hashlib
hashlib.sha1()
md5算法 、sha算法
字符串 -->加密的结果
md5算法 —— 暴力破解,撞库
sha算法 —— 是一个算法集,
随着后面的数字越大,计算的时间越长,结果越长,越安全
MD5的加密简单认证:
import hashlib md5_obj = hashlib.md5() md5_obj.update(b'alex3714') print(md5_obj.hexdigest())
aee949757a2e698417463d47acac93df
简单登陆练习:
# 简单登录练习 user = input('username : ') pwd = input('password : ') md5_obj = hashlib.md5() md5_obj.update(pwd.encode('utf-8')) str_md5 = md5_obj.hexdigest() with open('userinfo') as f: for line in f: name,passwd = line.split('|') if name == user and str_md5 == passwd: print('登录成功') break
sha算法:
sha_obj = hashlib.sha1() sha_obj.update(b'alex3714') print(sha_obj.hexdigest())
8a003668a9c990f15148f9e4046e1410781533b6
密码加盐:
import hashlib md5_obj = hashlib.md5('糖'.encode('utf-8')) md5_obj.update(b'123456') print(md5_obj.hexdigest())
ed174e8009ddb0c0182ada42a6b9a5cc
密码加盐登陆练习:
import hashlib password = input('password: ') md5_obj = hashlib.md5('糖'.encode('utf-8')) md5_obj.update(password.encode('utf-8')) md5_str = md5_obj.hexdigest() with open('userinfo') as f: for line in f: name,pwd = line.split('|') if name == username and pwd == md5_str: print('登录成功') break
动态加盐:
每一个用户的密码的密文的盐都不一样
username做盐
import hashlib username = input('username: ') password = input('password: ') md5_obj = hashlib.md5(username.encode('utf-8')) md5_obj.update(password.encode('utf-8')) str_md5 = md5_obj.hexdigest() print(str_md5) with open('userinfo') as f: for line in f: name,pwd = line.split('|') if name == username and pwd == str_md5: print('登录成功') break
username: ju password: 123 3464368a2951e7dca08671b24bdc0b63
md5第一个功能 —— 登录验证
md5算法和sha系列算法的用法
摘要算法的漏洞 —— 撞库
加盐的摘要算法 —— 恶意注册
动态加盐的摘要算法 —— 完美
MD5的第二个功能:
import hashlib md5_obj = hashlib.md5() md5_obj.update(b'alex') md5_obj.update(b'3714') str_md5 = md5_obj.hexdigest() print(str_md5) import os with open(r'D:\12期作业文件\22day\22day.py',encoding='utf-8') as f: file_size = os.path.getsize(r'D:\12期作业文件\22day\22day.py') md5_obj = hashlib.md5() while file_size > 0: str_content = f.read(1024) md5_obj.update(str_content.encode('utf-8')) file_size -= 1024 print(md5_obj.hexdigest())
aee949757a2e698417463d47acac93df
0632995331b223d43d7a1387656b39be
configparser模块:
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)
logging模块:
写日志的模块
在代码遇到问题的时候 —— 写给程序员看的
一些中间结果起到的排错作用
需要打印出来 —— 在排错的过程中
在真正提供服务的时候 —— 不需要
记录一些用户的行为 —— 写给用户看的
—— 写给公司看的
在代码遇到问题的时候 —— 写给程序员看的
一些中间结果起到的排错作用
需要打印出来 —— 在排错的过程中
在真正提供服务的时候 —— 不需要
记录一些用户的行为 —— 写给用户看的
—— 写给公司看的
记录一个字符串
写文件 print
logging模块???
格式规范
帮你把日志的紧急情况进行分类
写文件 print
logging模块???
格式规范
帮你把日志的紧急情况进行分类
import logging logging.debug('debug message') # 调试的时候 logging.info('info message') logging.warning('warning message') logging.error('error message') logging.critical('critical message') # 批判的
WARNING:root:warning message
ERROR:root:error message
CRITICAL:root:critical message
如果想调整日志信息显示情况,需要配置
基础配置basicConfig
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', filename = 'test.log' ) logging.debug('debug message') # 调试的时候 logging.info('info message') logging.warning('warning message') logging.error('error message') logging.critical('critical message') # 批判的
使用logger对象的形式进行配置
import logging
import logging logger = logging.getLogger() # 人 fmt = logging.Formatter('%(asctime)s -%(filename)s- %(name)s - %(levelname)s - %(message)s') # 格式 # 人 —— 练会了吸星大法 fh = logging.FileHandler('log',encoding='utf-8') # 创建了一个文件操作符 fh.setFormatter(fmt) #给文件操作符设置一个格式 logger.addHandler(fh) # 给logger对象添加fh武功 # # # 在屏幕上输入 sh = logging.StreamHandler() sh.setFormatter(fmt) sh.setLevel(logging.WARNING) logger.addHandler(sh) # logging.StreamHandler() # 创建了一个屏幕操作符 logger.setLevel(logging.DEBUG) logger.debug('debug message') # 调试的时候 logger.info('info message') logger.warning('warning message') logger.error('error message') logger.critical('critical message') # 批判的
2018-05-29 16:15:19,260 -4.logging模块.py- root - WARNING - warning message 2018-05-29 16:15:19,260 -4.logging模块.py- root - ERROR - error message 2018-05-29 16:15:19,260 -4.logging模块.py- root - CRITICAL - critical message