模块 hashlib和logging

hashlib模块

用处:用于文件加密,本质是一个自定义的字符编码表

原来是0和1转换为字符,现在是字符转换成另一种字符

前身是美国的md5加密密码锁,用于加密军事信息,可惜被中国一个神秘的博士给破解了,并发表出来,博士现在成功成为科学院院士

加密方法都是不可逆的,只能碰撞或者破解

名称:摘要算法,哈希算法,散列算法

通过一个函数,将任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)

这个函数为单向函数,单向很容易,反推很困难

import hashlib
md5 = hashlib.md5()
md5.update('i am big one')
print md5.hexdigest()
  1. hash加密之后长度一样

  2. hash加密东西一样则哈希结果一样

  3. 如果使用同一个哈希字符编码表,不断地哈希结果会增加

# 破解密码
# 他的密码一定是其中一个
pwd_list = [
   'haxi12312',
   '21312412',
   'asda1231221',
   '1qweq11',
]

def break_pwd(hash_pwd):
   for pwd in pwd_list:
       m = hashlib.md5()
       m.update(pwd.encode('utf8'))
       if m.hexdigest() == hash_pwd:
           return pwd
       
if __name__ == '__main__':
   #密码hash后的值
   hash_pwd = '0562b36c3c5a3925dbe3c4d32a4f2ba2'
   pwd = break_pwd(hash_pwd)
   print('这个用户密码是:',pwd)# 和print(f'这个用户密码是{pwd}')效果一样

 

 

hmac python中自带的模板:加盐处理

m = hmac.new(b'123')
m.update(b'12345')
print(m.hexdigest())

uuid模板,因为按照时间来生成,所以永不重复

import uuid
for i in range(10):
   print(uuid.uuid4())

 

logging模板

用处:记录日记(常用于记录程序的相关信息)

info(没有任何问题)--->debug(没有任何问题)--->warning(可以去做也可以不做)--->error(必须得做)--->critical(程序崩溃)

V1级别

name = input('name:>>')
total_prize = input('total_prize:>>>')

logging.info(f'{name}消费了{total_prize}元') #10
logging.debug(f'{name}消费了{total_prize}元') #20
logging.warning(f'{name}消费了{total_prize}元') #30
logging.error(f'{name}消费了{total_prize}元') #40
logging.critical(f'{name}消费了{total_prize}元') #50
  1. 把日志保存到文件中

  2. info的信息也要记录下来

V2级别

import logging

logging.basicConfig(filename='access.log',  #指定日志保存文件名
                   format ='%(asctime)s-%(name)s-%(levername)s-%(module)s:%(message)s',  # 指定日志格式
                   datefmt='%Y-%m-%d %H:%M:%S %p', # 时间
                   level=10 #控制保存的最低等级
                   name = input('name>>')total_prize = input('total_price>>')

                   
                                       

                   logging.info(f'{name}消费了{total_prize}元') #10
                   logging.debug(f'{name}消费了{total_prize}元') #20
                   logging.warning(f'{name}消费了{total_prize}元') #30
                   logging.error(f'{name}消费了{total_prize}元') #40
                   logging.critical(f'{name}消费了{total_prize}元') #50

  1. 对于不同的项目需要弄不同,不灵活

  2. 一直往文件写入,不可控不能打印

  3. 参数全部固定不变

V3版本(*****)

  1. logger 你是哪个版本的日志

  2. filter 不用管

  3. handler 是保存在文件中,还是打印到屏幕里

  4. formatter控制日志的格式

# 1. logger 你是哪个版本的日志
logger = logging.gerLogger('bank')
# 2. filter不用管
# 3. handler是保存在文件中,还是打印到屏幕里
t1 = logging.FileHandler('t1.log') #往文件中打印
t2 = logging.FileHandler('t2.log') #往文件中打印
sm = logging.StreamHandler()       # 往屏幕打印

# 4. formatter控制日志的格式
f1 = logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(module)s: %(message)s',
                     datefmt='%Y-%m-%d %H:%M:%S %p',)
f2 = logging.Formatter('%(asctime)s: %(message)s',
                     datefmt='%Y-%m-%d %H:%M:%S %p',)
f3 = logging.Formatter('%(name)s%(message)s',)

# 5. formatter 绑定到handler里面去
t1.setFormatter(f1)
t2.setFormatter(f2)
sm.setFormatter(f3)

# 6.handler 绑定到logger里面去
logger.addHandler(t1)
logger.addHandler(t2)
logger.addHandler(sm)

# 7. 设置打印级别
#logger.setLevel(10)# 控制着全部,先走全部,再走单个,如果不设置,默认30,必须得设置(因为不设置就和V2没区别了,依旧会有繁杂等问题)
t1.setLevel(20)
t2.setLevel(30)
sm.setLevel(40)

# 8.测试
logger.info('123')
logger.debug('123')
logger.warning('123')
logger.error('123')
logger.critical('123')

 

 

posted @ 2019-06-11 21:21  蜗牛少少  阅读(117)  评论(0编辑  收藏  举报