hashlib模块
用处:用于文件加密,本质是一个自定义的字符编码表
原来是0和1转换为字符,现在是字符转换成另一种字符
前身是美国的md5加密密码锁,用于加密军事信息,可惜被中国一个神秘的博士给破解了,并发表出来,博士现在成功成为科学院院士
加密方法都是不可逆的,只能碰撞或者破解
名称:摘要算法,哈希算法,散列算法
通过一个函数,将任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)
这个函数为单向函数,单向很容易,反推很困难
import hashlib
md5 = hashlib.md5()
md5.update('i am big one')
print md5.hexdigest()
-
hash加密之后长度一样
-
hash加密东西一样则哈希结果一样
-
如果使用同一个哈希字符编码表,不断地哈希结果会增加
# 破解密码
# 他的密码一定是其中一个
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
-
把日志保存到文件中
-
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
-
对于不同的项目需要弄不同,不灵活
-
一直往文件写入,不可控不能打印
-
参数全部固定不变
V3版本(*****)
-
logger 你是哪个版本的日志
-
filter 不用管
-
handler 是保存在文件中,还是打印到屏幕里
-
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')