subprocess模、hashlib模块、日志模块

subprocess模块

'''

  1. 可以用自己的电脑连接别人的电脑(socket) 

  2.通过subprocess模块可以在别人的计算机上执行我们想要执行的命令

  3.再把所执行的结果返回给我们自己的计算机

'''

import subprocess
res = subprocess.Popen('ipconfig', shell=True,stdout=subprocess.PIPE,stderr=subporcess.PIPE)
"""
    stdout:
            存储命令执行正确的结果
    stderr:
            存储命令执行错误的结果
"""
# stdout: <_io.BufferedReader name=3>
print("stdout:", res.stdout.read().decode('gbk'))
print("stderr:", res.stderr.read().decode('gbk'))

"""
    windows 内部默认的编码是GBK
"""

hashlib模块

1.摘要算法:又称哈希算法,散列算法。通过一个函数,将输入的数据转换为一个长度固定的数据串,通常使用十六进制的字符串来表示。

2.使用场景:给一些比较敏感的数据加密,防止安全问题。

3.加密操作的基本使用:

  1.首先选择加密方式:md系列、sha系列

  2.对数据进行加密

  3.获取加密之后的结果

  4.常见的加密算法是不能逆转为明文数据的

  5.同一种加密方式:不管加密的数据多长,加密之后的结果长度都是一样的

  6.加密方式不同,加密出来的结果长度不一样,结果长度越长,越难破解,但是在数据传输的过程中,占用的资源越多。

  7.加密方式我们通常选择md5加密就足够了

 import hashlib
# 1.选择加密方式
m =hashlib.md5()
# 2.对数据进行加密
m.update('hh'.encode('utf8'))  # update函数里面的数据必须是字节类型,bytes类型的 # 5e36941b3d856737e81516acd45edc50
# m.update('h'.encode('utf8'))  
# m.update('h'.encode('utf8'))  # 5e36941b3d856737e81516acd45edc50
# 3.获取加密之后的结果
res = m.hexdigest()
print(res)

实战案例

简单版密码加密

# 注册功能
username = input('username>>>:')
password = input('password>>>:')

# 对密码进行加密
import hashlib
m = hashlib.md5()
m.update(password.encode('utf8'))
new_password = m.hexdigest()

#将用户名和加密后的密码写入文件中
#以用户名|密码的形式写入文件
res = '%s|%s'%(username,new_password)
with open('userinfo.txt','w',encoding='utf8') as f:
    f.write(res)
print('%s注册成功' % username)

#登录功能
username = input('username>>>:')
password = input('password>>>:')

#对输入的密码进行加密处理
m = hashlib.md5()
m.update(password.encode('utf8'))
new_password = m.hexdigest()

# 进行判断
with open('userinfo.txt','r',encoding='utf8') as f:
    real_username,real_password =f.read().split('|')
if username == real_username and real_password == new_password:
    print('登录成功')
else:
    print('用户名或密码错误')

固态加盐

# 注册 固态加盐
username = input('username>>>:').strip()
password = input('password>>>:').strip()

# 对输入的密码进行加盐
import hashlib
m = hashlib.md5()
random_str = '@hhy'
new_password = password + random_str
m.update(new_password.encode('utf8'))
rel_password = m.hexdigest()
# 以用户名|密码的形式写入文件
res = '%s|%s' % (username,rel_password)
#写入文件
with open('userinfo.txt.','w',encoding='utf8') as f:
    f.write(res)

# 登录功能
username = input('username>>>:').strip()
password = input('password>>>:').strip()

# 对密码进行加盐处理
m = hashlib.md5()
random_str1 = '@hhy'
new_psw = password + random_str1
m.update(new_psw.encode('utf8'))
finally_psw = m.hexdigest()
# 读取出文件中的用户名和密码进行判断比较
with open('userinfo.txt','r',encoding='utf8') as f:
    real_name,real_psw = f.read().split('|')
if real_name == username and finally_psw == real_psw:
    print('登录成功')
else:
    print('登录失败')

动态加盐

# 动态加盐
# 随机生成盐
import random
def get_code(n):
    code = ''
    for i in range(n):
        random_int = str(random.randint(0,9))
        random_upper = chr(random.randint(65, 90))
        random_lower = chr(random.randint(97,122))
        stemp = random.choice([random_int,random_upper,random_lower])
        code +=stemp
    return code
# 注册功能
username = input('username>>>:').strip()
password = input('password>>>:').strip()
# 对密码进行动态加盐
import hashlib
m = hashlib.md5()
random_str = get_code(5)
new_pws = password + random_str
m.update(new_pws.encode('utf8'))
f_psw = m.hexdigest()

#存入文件
res = '%s|%s|%s' % (username,f_psw,random_str)
with open('userinfo.txt','w',encoding='utf8') as f:
    f.write(res)


# 登录
username = input('username>>>:').strip()
password = input('password>>>:').strip()

# 读取文件中的信息
with open('userinfo.txt','r',encoding='utf8') as f:
    real_name,real_psw,random_str = f.read().split('|')
# 对输入的密码进行加盐
import hashlib
m = hashlib.md5()
new_password = password + random_str
m.update(new_password.encode('utf8'))
final_psw = m.hexdigest()

# 进行判断
if real_name ==username and final_psw == real_psw:
    print('登录成功')
else:
    print('登录失败')

日志模块

日志:

  记录代码在执行过程中产生的一些变化(记录的是一些有意义的变化)

日志的等级:

import logging

logging.debug('debug message')   # 10
logging.info('info message')      # 20
logging.warning('warning message')   # 30
logging.error('error message')        # 40
logging.critical('critical message')        # 50

日志的配置参数:

format参数中可能用到的格式化串:
%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s用户输出的消息

日志的详细用法:

日志的组成部分:

  1.logger对象 :负责产生日志

    logger = logging.getLogger()  # 获取logger对象

  2.filter对象:负责过滤日志(直接忽略)

  3.handler对象:负责日志产生的位置  

    hd1 = logging.FileHandler('a1.log', encoding='utf8') # 产生到a1.log文件的
    hd2 = logging.FileHandler('a2.log', encoding='utf8') # 产生到a2.log文件的
    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',
)
# 2023-06-13 11:49:53 - root - DEBUG -05 日志的详细使用:  写了半天 好累啊 好热啊
fm2 = logging.Formatter(
    fmt='%(asctime)s - %(name)s %(message)s',
    datefmt='%Y-%m-%d',
)
# 2023-06-13 - root 写了半天 好累啊 好热啊

  5.绑定handler对象 

    logger.addHandler(hd1)
    logger.addHandler(hd2)
    logger.addHandler(hd3)

  6.绑定formatter对象

    hd1.setFormatter(fm1)
    hd2.setFormatter(fm2)
    hd3.setFormatter(fm1)

  7.设置日志等级

    logger.setLevel(10)

  8.记录日志

    logger.debug('写了半天 好累啊 好热啊')

handler对象可以有好很多个,formatter对象也可以有很多个。

 

posted @ 2023-06-13 19:22  Maverick-Lucky  阅读(18)  评论(0)    收藏  举报