摘要算法

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 = 3
while 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
posted on 2017-11-23 20:36  耿耿于晓  阅读(1441)  评论(0编辑  收藏  举报