import hashlib#摘要算法的模块# Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。## 什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它经过一个函数,把任意长度的数据转换为一个长度固定的数据串(一般用16进制的字符串表示)。## 摘要算法就是经过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。## 摘要算法之因此能指出数据是否被篡改过,就是由于摘要函数是一个单向函数,计算f(data)很容易,但经过digest反推data却很是困难。并且,对原始数据作一个bit的修改,都会致使计算出的摘要彻底不一样。# 咱们以常见的摘要算法MD5为例,计算出一个字符串的MD5值:# md5_obj = hashlib.md5() #选择摘要算法中的md5类进行实例化,获得获得md5_obj# md5_obj.update(b'12345')#对一个字符串进行摘要# md5_obj.update(b'xiaoxiao')#对一个字符串进行摘要# print(md5_obj.hexdigest())#找摘要算法要结果## md5_obj = hashlib.md5()# md5_obj.update(b'12345xiaoxiao')# print(md5_obj.hexdigest())# MD5是最多见的摘要算法,速度很快,生成结果是固定的128 bit字节,# 一般用一个32位的16进制字符串表示。另外一种常见的摘要算法是SHA1,# 调用SHA1和调用MD5彻底相似# md5_obj = hashlib.md5()#选择摘要算法中的md5类进行实例化,获得md5_obj# md5_obj.update(b'how to use md5 in python hashlib?alex')#对一个字符串进行摘要# print(md5_obj.hexdigest()) #找摘要算法要结果#一篇文章的校验#读文件 : 一行一行拿#转换成bytes#文件1#文件2#分别打开两个文件,一行一行读,没一行update一下 对比最终的hexdigest# 查看某两个文件是否彻底一致 —— 文件的一致性校验# 加密认证 —— 在存储密码的时候是使用密文存储的,校验密码的时候对用户的输入再作一次校验# 加盐# 动态加盐# import hashlib# sha256_obj = hashlib.sha256('*!金老板'.encode('utf_8'))# sha256_obj.update(b'12344')# print(sha256_obj.hexdigest())#用户名 + 一个复杂的字符串 + 密码#hashilib 摘要算法的模块# md5 sha1 sha256 sha512# 摘要的过程 不可逆# 能作的事儿: #文件的一致性检测 #用户的加密认证 #单纯的mg5不够安全 #加盐处理 简单的盐可能被破解 且破解以后全部的盐都失效了 #动态加盐# 默认状况下Python的logging模块将日志打印到了标准输出中,# 且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING# (日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG)# ,默认的日志格式为日志级别:Logger名称:用户输出消息。# log 日志# 5000# 帐单 —— 日志# 计算器中间结果 —— 日志# 搜索、加入购物车、购买了的东西 —— 日志# 股票市场的用户行为 —— 日志# 日志 就是在程序的运行过程当中,人为的添加一些要打印的中间信息# 在程序的排错、在一些行为、结果的记录# import logging# logging.debug('debug message') #调试模式# logging.info('info message')#信息模式# logging.warning('warning message')#警告模式:不会直接程序的崩溃,可能会出现问题# logging.error('error message')#错误模式:出错了## logging.critical('critical message')#批判模式 程序崩溃了的时候# logging 简单的配置模式## logging.basicConfig(level=logging.DEBUG,# format='[%(asctime)s]%(filename)s[line:%(lineno)d] %(levelname)s %(message)s',# datefmt='%Y-%m-%d %H:%M:%S',# filename='test.log',# filemode='a')# logging.debug('debug message')# logging.info('info message')# logging.warning('warning message')# logging.error('error message')# logging.critical('critical message')# try:# r = input('num : ')# int(r)# except:# logging.error('please input a num!')# logger = logging.getLogger() #实例化一个logger对象# # 建立一个handler,用于写入日志文件# fh = logging.FileHandler('test.log',encoding='utf-8') # 文件句柄-日志文件操做符# formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') #日志输出格式# formatter2 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') #日志输出格式# fh.setFormatter(formatter) #文件句柄 绑 格式# logger.setLevel(logging.DEBUG) #设置日志等级,默认是Warning# logger.addHandler(fh) #logger 绑文件句柄# sh = logging.StreamHandler() #屏幕流对象# sh.setFormatter(formatter2)# logger.addHandler(sh)# logger.info('hello!')# logger = logging.getLogger()# fh = logging.FileHandler('test.log.20171123',encoding='utf-8')# logger.addHandler(fh)#对象的模式 #能够随意控制往那些地方输出日志 #能够分别控制输出到不一样位置的格式# import logging# logger = logging.getLogger() #实例化一个logger对象# fh = logging.FileHandler('test.log',encoding='utf-8') # 文件句柄-日志文件操做符# formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') #日志输出格式# fh.setFormatter(formatter) #文件句柄 绑 格式# logger.setLevel(logging.DEBUG) #设置日志等级,默认是Warning# logger.addHandler(fh) #logger对象绑文件句柄# logger.info('hello!')#向屏幕输出# logger.setLevel(logging.DEBUG) #设置日志等级# formatter2 = logging.Formatter('%(asctime)s - %(name)s [%(levelname)s] %(message)s') #日志输出格式# sh = logging.StreamHandler() #屏幕流对象 相对于文件句柄# sh.setFormatter(formatter2) # 绑定格式到日志文件操做符# logger.addHandler(sh) # 绑定屏幕流对象到logging对象# logging.info("我是你爸爸")# logging.basicConfig()函数中可经过具体参数来更改logging模块默认行为,可用参数有:## filename:用指定的文件名建立FiledHandler,这样日志会被存储在指定的文件中。# filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。# format:指定handler使用的日志显示格式。# datefmt:指定日期时间格式。# level:设置rootlogger(后边会讲解具体概念)的日志级别# stream:用指定的stream建立StreamHandler。能够指定输出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。## 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用户输出的消息# 首先让用户输入帐号密码#对密码加密 写到文件里 完成用户注册#再次让用户输入帐号密码, 密码和文件中的密码进行匹配 匹配成功则登陆成功import hashlib# name = input('请输入用户名:')# pwd = input('请输入密码:')# md5_obj = hashlib.md5()# md5_obj.update(pwd.encode('utf-8'))# # print(md5_obj.hexdigest())# f = open('haha','a',encoding='utf-8')# f.write(name+' '+md5_obj.hexdigest()+'\n')# f.close()count = 3while count>0 : s = 2 name = input('请输入用户名:').strip() pwd = input('请输入密码:').strip() md5_obj = hashlib.md5() md5_obj.update(pwd.encode('utf-8')) ret = md5_obj.hexdigest() f = open('haha', 'r', encoding='utf-8') for i in f: # print('sgjhg') i = i.strip() i = i.split(' ') if ret == i[1] and name == i[0]: print('登录成功') s = 1 break if s == 2: print('输入错误') count= count-1 if s == 1: break