zoukankan      html  css  js  c++  java
  • 摘要算法

    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()+' ')
    # 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
  • 相关阅读:
    [转]实习生需要懂的40大基本规矩
    [转]Linux下pppoe配合Drcom插件上网方法介绍......
    收藏一些图书
    [转]30个自我提升技巧
    [转]关于Gmail打不开的解决办法
    [转]李开复经典语录盘点:人生之路在于每次的选择
    [转]哈佛管理世界中智慧
    胡伟武校友在2011年中国科大本科生毕业典礼暨学位授予仪式上的讲话
    Dynamics4.0和Dynamics2011处理Email的方法
    JS实现简单的ToolTip功能
  • 原文地址:https://www.cnblogs.com/zhuchuanbo/p/7886883.html
Copyright © 2011-2022 走看看