• 模块hashlib和logging


    Python的hashlib提供了常见的摘要算法MD5。

    我们以常见的摘要算法MD5为例,计算出一个字符串的MD5值:

    import hashlib
    md5=hashlib.md5()
    md5.update('how to use md5 in python'.encode('utf-8'))
    print(md5.hexdigest())

    如果数据量很大,可以分块多次调用update(),最后计算的结果是一样的:

    import hashlib
    md5=hashlib.md5()
    md5.update('how to use md5'.encode('utf-8'))
    md5.update(' in python'.encode('utf-8'))
    print(md5.hexdigest())
    
    >>>
    cdbbdefc48242586611e311f84e921b0

    考虑这么个情况,很多用户喜欢用123456,888888,password这些简单的口令,于是,黑客可以事先计算出这些常用口令的MD5值,得到一个反推表:

    'e10adc3949ba59abbe56e057f20f883e': '123456'
    '21218cca77804d2ba1922c33e0151105': '888888'
    '5f4dcc3b5aa765d61d8327deb882cf99': 'password'

    这样,无需破解,只需要对比数据库的MD5,黑客就获得了使用常用口令的用户账号.

    由于常用口令的MD5值很容易被计算出来,所以,要确保存储的用户口令不是那些已经被计算出来的常用口令的MD5,这一方法通过对原始口令加一个复杂字符串来实现,俗称“加盐”:

    例如一个简单的用户登录实例:

    import hashlib
    
    SALT = b'2erer3asdfwerxdf34sdfsdfs90'
    def md5(pwd):
        # 实例化对象
        obj = hashlib.md5(SALT)
        # 写入要加密的字节
        obj.update(pwd.encode('utf-8'))
        # 获取密文
        return obj.hexdigest()  # c5395258d82599e5f1bec3be1e4dea4a
    
    user = input("请输入用户名:")
    pwd = input("请输入密码:")
    if user == 'oldboy' and md5(pwd) == 'c5395258d82599e5f1bec3be1e4dea4a':
        print('登录成功')
    else:
        print('登录失败')
    View Code

    logging模块

    import logging  
    logging.debug('debug message')  
    logging.info('info message')  
    logging.warning('warning message')  
    logging.error('error message')  
    logging.critical('critical message') 

    默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG),默认的日志格式为日志级别:Logger名称:用户输出消息。

    import logging  
    logging.basicConfig(level=logging.DEBUG,  
                        format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',  
                        datefmt='%a, %d %b %Y %H:%M:%S',  
                        filename='/tmp/test.log',  
                        filemode='w')  
      
    logging.debug('debug message')  
    logging.info('info message')  
    logging.warning('warning message')  
    logging.error('error message')  
    logging.critical('critical message')
  • 相关阅读:
    学习小记: Kaggle Learn
    eclipse 一些快捷键
    Map接口
    学习笔记
    泛型方法 类 接口
    TreeSet
    xml
    Java笔试题目-my
    迭代器三种遍历方法
    线程请求其他线程资源
  • 原文地址:https://www.cnblogs.com/feifeifeisir/p/9571911.html
Copyright © 2020-2023  润新知