hashlib模块,subprocess模块,logging日志模块

hashlib模块,subprocess模块,logging日志模块

hashlib加密模块

什么是加密?

用来将一段明文处理成密文数据,让人无法看懂。
应用场景:
比如说我们平时登录的时候输入的密码。

为什么要加密?

我们在输入密码或做一些操作时不进行加密可能会被别人获取。
为了保证数据的安全,所以必须要加密

密文的特点与常见的算法

1.如何判断是否是密文
一串没有规律的字符串 # 由数字,字母,符号组成。
2.密文的长短有何区别
密文越长表示使用的加密算法越复杂。 
3.常见的加密算法:
md5, base64, hmac, sha系列

加密算法的基本操作

import hashlib
# 选择加密算法 这里以md为例
md5 = hashlib.md5()
##  将明文数据传递给算法对象,并且直接接受bytes类型
md5.update(b'yellow Tv') # 如果字符串是纯数字和英文,那么直接在前面加b转变成bytes类型
# 获取加密后的密文
res = md5.hexdigest()  
print(res)
# 9662df0f9064a67e3c87e8df0bc7e788

传入数据一致时 算法加密结果是一样的
import hashlib
md5 = hashlib.md5()
md5.update(b'yellow')
md5.update(b' Tv')
res = md5.hexdigest()
print(res)
# 9662df0f9064a67e3c87e8df0bc7e788


"通过用户的输入进行加密"
pwd = input('请输入密码').strip()  # 123
md5 = hashlib.md5() 
md5.update(pwd.encode())
res = md5.hexdigest()
print(res)
# 202cb962ac59075b964b07152d234b70



"""加密的结果是无法进行反解密的"""
我们常见的md5 解密过程 其实就是 提前猜测了无数组'数字或英文结合组成的方式的结果'进行加密后放入数据库,根据我们输入的密文来进行对比,才能得出结果。
eg:
    123    密文
    222    密文
    1b1    密文

增加密文破解的难度 加盐/动态加盐

1. 加盐处理
md5 = hashlib.md5()
md5.update('我设置的干扰项'.encode('utf8'))  # 字符串需提前转格式
md5.update(b'1b1')
res = md5.hexdigest()
print(res)
"""在我们真实需要加密的明文前加上干扰项可以增加破解难度"""

2.动态加盐(用来动态变化干扰)
可以是用户名的一部分,也可以是当时时间
"需要提前导入 time 模块"
md5 = hashlib.md5()
md5.update(time.strftime('%Y年%m月%d日%H时%M分%S秒').encode('utf8'))
md5.update(b'1b1')
res = md5.hexdigest()
print(res)

加密应用场景

# 加密应用场景
""" 密码加密如何比对
   用户输入的还是明文但是到了程序里面就会采用相同的加密算法变成密文——然后对数据库里面的密文进行比对,如果一致就是正确,不一致就是错误
  
   文件内容一致性校验
  在提供安全软件的同时,会对给该内容做加密处理得到一个该安全软件独有的密文
  用户在下载软件之后也会对内容做相同的加密比对两次密文是否一致
  如果一致,那就表示中途没有被修改, 如果不一致那就表示中途被修改、可能会存在病毒"""
  
针对大文件一致性校验的优化策略
如果一个文件10G,那么当全部读取并加密速度太慢,这个时候可以考虑对文件内容根据光标随机抽选几处内容 读取并加密的操作

subprocess模块

import subprocess

res = subprocess.Popen(
    'dir',  # 操作系统要执行的命令
    shell=True,  # 固定配置
    stdin=subprocess.PIPE,  # 输入命令
    stdout=subprocess.PIPE,  # 输出结果
)
print('正确结果', res.stdout.read().decode('gbk'))  # 获取操作系统执行命令之后的正确结果
print('错误结果', res.stderr)  # 获取操作系统执行命令之后的错误结果

"""
该模块可以实现远程操作其他计算机的功能
    动态获取命令执行并返回结果
        eg:类似于Xshell软件的功能
"""

logging 日志模块

什么是日志

记录用户操作,保存下来供我们查询的文本。

日志的五种级别与日常使用

import logging
logging.debug('debug message')  # 程序的大小事全部记录
logging.info('info message')  # 记录日常的事
logging.warning('warning message')  # 记录可能会发生的错误警告
logging.error('error message')  # 发生的错误
logging.critical('critical messgae')  # 程序崩了
import logging


日常使用:
file_handler = logging.FileHandler(filename='x1.log', mode='a', encoding='utf-8', )

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('嘿嗨嘿')

日志的模块组成部分

# logging日志模块四大组件
1、logger:产生日志
2、filter:过滤日志
    # 基本不用 因为在日志产生阶段就可以控制想要的日志内容 
3、handler: 输出日志  #  用来控制日志的输出位置(文件、终端...)  
4、format: 日志格式
 
import logging


logger = logging.getLogger('转账记录')
hd1 = logging.FileHandler('a1.log', encoding='utf8')  # 输出到文件a1
hd2 = logging.FileHandler('a2.log', encoding='utf8')  # 输出到文件a2
hd3 = logging.StreamHandler()  # 输出到终端
# 进行日志格式的编辑
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',
)
# 绑定对象
logger.addHandler(hd1)
logger.addHandler(hd2)
logger.addHandler(hd3)
# 绑定format对象
hd1.setFormatter(fm1)
hd2.setFormatter(fm2)
hd3.setFormatter(fm1)
# 设置等级划分
logger.setLevel(10) # 10——debug,20——info, 30——warning, 40——error, 50——critical
# 记录日志
logger.debug('怎么回事')

日志字典

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'
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配置
        # '购物车记录': {
        #     'handlers': ['default','console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
        #     'level': 'WARNING',
        #     'propagate': True,  # 向上(更高level的logger)传递
        # },  # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
    },
}
logging.config.dictConfig(LOGGING_DIC)  # 自动加载字典中的配置
# logger1 = logging.getLogger('购物车记录')
# logger1.warning('尊敬的VIP客户 晚上好 您又来啦')
# logger1 = logging.getLogger('注册记录')
# logger1.debug('jason注册成功')
logger1 = logging.getLogger('红浪漫顾客消费记录')
logger1.debug('慢男 猛男 骚男')

日志里需要记住的

logging.config.dictConfig(LOGGING_DIC)  # 自动加载字典中的配置 LOGGING_DIC 字典名
logger1 = logging.getLogger('消费记录')
logger1.debug('')    # debug 是日志等级 可以根据设置的等级变更
posted @ 2022-10-27 20:11  李阿鸡  阅读(37)  评论(0编辑  收藏  举报
Title