hashlib加密模块
1.何为加密
将文明数据处理成密文数据 让人无法看懂
2.为什么要加密
保证数据的安全,防止密码泄露
3.如何判断数据是否加密
密文数据的表现形式一般都是一串没有规则的字符串(数字、字母、符号)
4.加密算法
将明文变成密文的内部规则,算法的难易程度可以根据产生密文的长短来判断,越长越复杂
5.常见的加密算法有:md5、base64、hmac、sha系列
使用方法
import hashlib
# 使用指定算法——md5算法
md5 = hashlib.md5()
# 将明文数据传递给算法对象,并且直接接受bytes类型
md5.update(b'hello world') # 如果字符串是纯数字和英文,那么直接在前面加b转变成bytes类型
# 获取加密数据
res = md5.hexdigest()
print(res)
加密补充说明
1.加密算法不变 内容如果相同 那么结果肯定相同
# md5.update(b'hello~world~python~666') # 一次 性传可以
md5.update(b'hello') # 分多次传也可以
md5.update(b'~world') # 分多次传也可以
md5.update(b'~python~666') # 分多次传也可以
2.加密之后的结果是无法直接反解密的
md5解密内部本质
提前想好很多可能是密码的组合
123 自己加密
321 自己加密
222 自己加密
{'密文1':123,'密文2':321}
3.加盐处理(增加破解的难度)
在明文里面添加一些额外的干扰项
# 1.选择加密算法
md5 = hashlib.md5()
# 2.传入明文数据
md5.update('公司设置的干扰项'.encode('utf8'))
md5.update(b'hello python') # 一次性传可以
# 3.获取加密密文
res = md5.hexdigest()
print(res)
4.动态加盐(用来干扰动态变化)
干扰项是随机变化的
可以是用户名的一部分、也可以是当前的时间
加密的应用场景
'''
1.密码加密如何比对
用户输入的还是明文但是到了程序里面就会采用相同的加密算法变成 密文——然后对数据库里面的密文进行比对,如果一致就是正确,不 一致就是错误
2.文件内容一致性校验
在提供安全软件的同时,会对给该内容做加密处理得到一个该安全软 件独有的密文
用户在下载软件之后也会对内容做相同的加密比对两次密文是否一致
如果一致,那就表示中途没有被修改, 如果不一致那就表示中途被 修改、可能会存在病毒
'''
subprocess模块
subprocess是python内置的模块,这个模块中的Popen可以查看用户输入的命令行是否存在
存在:把内容写入到stdout管道中
不存在:把信息写入到stderr管道
'''需要注意的是,这个模块的返回结果只能让开发者看一次,如果想多次查看,需要在第一次输出的时候,把所有信息写入到变量中'''
popen用法
import subprocess
r = subprocess.Popen('asdas', # 操作系统要执行的命令
shell=True, # 固定配置
stdin=subprocess.PIPE, # 输入命令
stdout=subprocess.PIPE, # 输出结果
)
print('正确结果', r.stdout.read().decode('gbk')) # 获取操作系统执行命令之后的正确结果
print('错误结果', r.stderr) # 获取操作系统执行命令之后的错误结果
logging日志模块
日志是一种可以卓总某些软件运行时所发生事情的方法。软件开发人员可以向他们的代码中调用日志记录相关的方法来表明发生了某些事情。一个事件可包含可选变量数据的消息来描述。此外,时间也有重要性的概念,这个重要性也可以被称为严重性级别(level)。
日志的等级
| 级别 |
何时使用 |
| DEBUG |
详细信息,典型地调试问题时会感兴趣 详细的debug信息 |
| INFO |
证明事情按预期工作 关键事件 |
| WARNING |
表明发生了一些意外,或者不久的将来会发生问题 软件还是在正常工作 |
| ERROR |
由于更严重的问题,软件已不能执行一些共嗯那个 一般错误消息 |
| CRITICAL |
严重错误,表明软件已不能继续运行了 |
| NOTICE |
不是错误,但是可能需要处理。普通但是重要的时事件 |
| ALERT |
需要立即修复,例如系统数据库损坏 |
| EMERGENCY |
紧急情况,系统不可用(例如系统崩溃),一般会通知所有用户 |
logging用法
import logging
logging.debug("this is s debug message")
logging.info("this is a info message")
logging.warning("this is a warning message")
logging.error("this is a error message")
logging.critical("this is a critical message")
# 这里只显示warning及以上的日志
file_handler = logging.FileHandler(filename='x1.log', mode='a', encoding='utf8',)
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',handlers=[file_handler,],level=logging.ERROR)
logging.error('你好')
日志的组成
1.产生日志
2.过滤日志
基本不用 因为在日志产生阶段就可以控制想要的日志内容
3.输出日志
4.日志格式
import logging
# 1.日志的产生(准备原材料) logger对象
logger = logging.getLogger('购物车记录')
# 2.日志的过滤(剔除不良品) filter对象>>>:可以忽略 不用使用
# 3.日志的产出(成品) handler对象
hd1 = logging.FileHandler('a1.log', encoding='utf-8') # 输出到文件中
hd2 = logging.FileHandler('a2.log', encoding='utf-8') # 输出到文件中
hd3 = logging.StreamHandler() # 输出到终端
# 4.日志的格式(包装) format对象
fm1 = logging.Formatter(
fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
)
fm2 = logging.Formatter(
fmt='%(asctime)s - %(name)s: %(message)s',
datefmt='%Y-%m-%d',
)
# 5.给logger对象绑定handler对象
logger.addHandler(hd1)
logger.addHandler(hd2)
logger.addHandler(hd3)
# 6.给handler绑定formmate对象
hd1.setFormatter(fm1)
hd2.setFormatter(fm2)
hd3.setFormatter(fm1)
# 7.设置日志等级
logger.setLevel(10) # debug
# 8.记录日志
logger.debug('写了半天 好累啊')
日志配置字典
# 核心就在于CV
import logging
import logging.config
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
'[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
logfile_path = 'a3.log'
# log配置字典
LOGGING_DIC = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': standard_format
},
'simple': {
'format': simple_format
},
},
'filters': {}, # 过滤日志
'handlers': {
#打印到终端的日志
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler', # 打印到屏幕
'formatter': 'simple'
},
#打印到文件的日志,收集info及以上的日志
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'standard',
'filename': logfile_path, # 日志文件
'maxBytes': 1024*1024*5, # 日志大小 5M
'backupCount': 5,
'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
},
},
'loggers': {
#logging.getLogger(__name__)拿到的logger配置 空字符串作为键 能够兼容所有的日志
'': {
'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'level': 'DEBUG',
'propagate': True, # 向上(更高level的logger)传递
}, # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
},
}
# 使用配置字典
logging.config.dictConfig(LOGGING_DIC) # 自动加载字典中的配置
logger1 = logging.getLogger('xxx')
logger1.debug('好好的 不要浮躁 努力就有收获')

