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对象也可以有很多个。
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号