zoukankan      html  css  js  c++  java
  • python 22 days

    python 22 days

    hashlib模块、configparser模块、logging模块

    hash()

        把一个数据转换成一个数字的算法
        在同一次执行的过程中,
        对同一个可hash的值进行计算得出的结果总是相同的
    做什么用的?
    有什么特点?
    基础数据类型的时候
        不可变数据类型可hash
        可变数据类型不可hash
     
    print(hash('abc')) #-2148338516684256523
    print(hash('abc'))
    print(hash('abc'))
    print(hash('abc'))
    例题展示
    -6430976884502984568
    -6430976884502984568
    -6430976884502984568
    -6430976884502984568
    
    
    结果是可变的
    结果展示

    字典
    集合
    在数据的存储方面提供优化的
    为什么对同一个值计算hash值每次运行结果不同??
        由于每一次执行所获得的存储空间都不一定相同。
        所以多次执行统一代码得到的hash值可能不同

    hashlib的模块:

    hashlib的特点
    是一个模块 ,提供多种算法
    同一个字符串用同一种算法进行加密,结果总是相同的
    同一个字符串用不同的算法进行加密,结果总是不同的
    那为什么要使用hashlib进行加密呢?
    1. 登录
        alex3714 --> 转换 --> 转换之后的结果储存在文件里
        # 用户登录的时候
        输入密码--> 用同样的方法转换 -->结果于文件中的匹配

    import hashlib
    hashlib.sha1()
    md5算法 、sha算法
    字符串 -->加密的结果
    md5算法 —— 暴力破解,撞库
    sha算法 —— 是一个算法集,
        随着后面的数字越大,计算的时间越长,结果越长,越安全

    MD5的加密简单认证:

    import hashlib
    
    md5_obj = hashlib.md5()
    md5_obj.update(b'alex3714')
    print(md5_obj.hexdigest())
    例题展示
    aee949757a2e698417463d47acac93df
    结果展示

    简单登陆练习:

    # 简单登录练习
    user = input('username : ')
    pwd = input('password : ')
    md5_obj = hashlib.md5()
    md5_obj.update(pwd.encode('utf-8'))
    str_md5 = md5_obj.hexdigest()
    with open('userinfo') as f:
        for line in f:
            name,passwd = line.split('|')
            if name == user and str_md5 == passwd:
                print('登录成功')
                break
    例题展示

     sha算法:

    sha_obj = hashlib.sha1()
    sha_obj.update(b'alex3714')
    print(sha_obj.hexdigest())
    例题展示
    8a003668a9c990f15148f9e4046e1410781533b6
    结果展示

    密码加盐:

    import hashlib
    md5_obj = hashlib.md5(''.encode('utf-8'))
    md5_obj.update(b'123456')
    print(md5_obj.hexdigest())
    例题展示
    ed174e8009ddb0c0182ada42a6b9a5cc
    结果展示

    密码加盐登陆练习:

    import hashlib
    password = input('password: ')
    md5_obj = hashlib.md5(''.encode('utf-8'))
    md5_obj.update(password.encode('utf-8'))
    md5_str = md5_obj.hexdigest()
    with open('userinfo') as f:
        for line in f:
            name,pwd = line.split('|')
            if name == username and pwd == md5_str:
                print('登录成功')
                break
    例题展示

    动态加盐:
    每一个用户的密码的密文的盐都不一样
    username做盐

    import hashlib
    username = input('username: ')
    password = input('password: ')
    md5_obj = hashlib.md5(username.encode('utf-8'))
    md5_obj.update(password.encode('utf-8'))
    str_md5 = md5_obj.hexdigest()
    print(str_md5)
    with open('userinfo') as f:
        for line in f:
            name,pwd = line.split('|')
            if name == username and pwd == str_md5:
                print('登录成功')
                break
    例题展示
    username: ju
    password: 123
    3464368a2951e7dca08671b24bdc0b63
    结果展示

    md5第一个功能 —— 登录验证
    md5算法和sha系列算法的用法
    摘要算法的漏洞 —— 撞库
    加盐的摘要算法 —— 恶意注册
    动态加盐的摘要算法 —— 完美

    MD5的第二个功能:

    import hashlib
    md5_obj = hashlib.md5()
    md5_obj.update(b'alex')
    md5_obj.update(b'3714')
    str_md5 = md5_obj.hexdigest()
    print(str_md5)
    import os
    with open(r'D:12期作业文件22day22day.py',encoding='utf-8') as f:
        file_size = os.path.getsize(r'D:12期作业文件22day22day.py')
        md5_obj = hashlib.md5()
        while file_size > 0:
            str_content = f.read(1024)
            md5_obj.update(str_content.encode('utf-8'))
            file_size -= 1024
        print(md5_obj.hexdigest())
    例题展示
    aee949757a2e698417463d47acac93df
    0632995331b223d43d7a1387656b39be
    结果展示

    configparser模块:

    import configparser
    config = configparser.ConfigParser()
    config["DEFAULT"] = {'ServerAliveInterval': '45',
                          'Compression': 'yes',
                         'CompressionLevel': '9',
                         'ForwardX11':'yes'
                         }
    config['bitbucket.org'] = {'User':'hg'}
    config['topsecret.server.com'] = {'Host Port':'50022','ForwardX11':'no'}
    with open('example.ini', 'w') as f:
       config.write(f)
    例题展示

    logging模块:

    写日志的模块
    在代码遇到问题的时候 —— 写给程序员看的
        一些中间结果起到的排错作用
        需要打印出来 —— 在排错的过程中
        在真正提供服务的时候 —— 不需要
    记录一些用户的行为 —— 写给用户看的
                     —— 写给公司看的
    记录一个字符串
    写文件 print
    logging模块???
        格式规范
        帮你把日志的紧急情况进行分类
     
    import logging
    logging.debug('debug message')  # 调试的时候
    logging.info('info message')
    logging.warning('warning message')
    logging.error('error message')
    logging.critical('critical message')  # 批判的
    例题展示
    WARNING:root:warning message
    ERROR:root:error message
    CRITICAL:root:critical message
    结果展示

    如果想调整日志信息显示情况,需要配置
    基础配置basicConfig

    logging.basicConfig(level=logging.DEBUG,
    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
    filename = 'test.log'        )
    logging.debug('debug message')  # 调试的时候
    logging.info('info message')
    logging.warning('warning message')
    logging.error('error message')
    logging.critical('critical message')  # 批判的
    例题展示

    使用logger对象的形式进行配置
    import logging

    import logging
    logger = logging.getLogger()
    #
    fmt = logging.Formatter('%(asctime)s -%(filename)s- %(name)s - %(levelname)s - %(message)s') # 格式
    # 人 —— 练会了吸星大法
    fh = logging.FileHandler('log',encoding='utf-8')  # 创建了一个文件操作符
    fh.setFormatter(fmt)         #给文件操作符设置一个格式
    logger.addHandler(fh)  # 给logger对象添加fh武功
    #
    # # 在屏幕上输入
    sh = logging.StreamHandler()
    sh.setFormatter(fmt)
    sh.setLevel(logging.WARNING)
    logger.addHandler(sh)
    
    # logging.StreamHandler()  # 创建了一个屏幕操作符
    logger.setLevel(logging.DEBUG)
    
    logger.debug('debug message')  # 调试的时候
    logger.info('info message')
    logger.warning('warning message')
    logger.error('error message')
    logger.critical('critical message')  # 批判的
    例题展示
    2018-05-29 16:15:19,260 -4.logging模块.py- root - WARNING - warning message
    2018-05-29 16:15:19,260 -4.logging模块.py- root - ERROR - error message
    2018-05-29 16:15:19,260 -4.logging模块.py- root - CRITICAL - critical message
    结果展示
  • 相关阅读:
    WingIIDE的licese破解方法
    HttpCookie
    Jquery中html()方法 and "click"绑定后代元素
    jquery 选择器多个
    input标签的type为select、radio、checkbox的使用
    c#中?和??使用
    VS中使用附加进程来调试项目
    刷新局部页面
    ant design vue 文件上传的集中页面
    vue 上传超大文件出现Uncaught (in promise) Error: Network Error at createError
  • 原文地址:https://www.cnblogs.com/juxiansheng/p/9105670.html
Copyright © 2011-2022 走看看