python hashlib、configparse、logging-程序员宅基地

技术标签: python  操作系统  数据库  

一、hashlib
  1.Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。
 
 
  2.摘要算法
  通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。
  摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。
 
  3.MD5:MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。
  • import hashlib
    md5 = hashlib.md5()
    md5.update(b'password')
    ret = md5.hexdigest()    #加密结果
 
  4.SHA1: SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示
  • import hashlib
    sha1 = hashlib.sha1()
    sha1.update(b'how to use sha1 in ')
    sha1.update(b'python hashlib?')
    print(sha1.hexdigest())

     

  比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,而且摘要长度更长。
  不同算法使用hashlib的方式相同,待加密的字符串要是bytes类型的。
 
 
  5.由于常用口令的MD5值很容易被计算出来,所以,要确保存储的用户口令不是那些已经被计算出来的常用口令的MD5,这一方法通过对原始口令加一个复杂字符串来实现,俗称“加盐”:
  例子:
  • import hashlib
    sha1 = hashlib.sha1("gjdi32@$^#$dsdg;d//.sdf,g.235!$@#^$%&dfg.".encode('utf-8'))
    sha1.update(b'how to use sha1 in ')
    sha1.update(b'python hashlib?')
    print(sha1.hexdigest())
  经过Salt处理的MD5口令,只要Salt不被黑客知道,即使用户输入简单口令,也很难通过MD5反推明文口令。
  但是如果有两个用户都使用了相同的简单口令比如123456,在数据库中,将存储两条相同的MD5值,这说明这两个用户的口令是一样的。有没有办法让使用相同口令的用户存储不同的MD5呢?
  如果假定用户无法修改登录名,就可以通过把登录名作为Salt的一部分来计算MD5,从而实现相同口令的用户也存储不同的MD5。
  摘要算法在很多地方都有广泛的应用。要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改,但是它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令。
 
  6.应用:
  密码存储
  文件完整性、一致性验证
 
二、configparse
  1.适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键=值)。
 
  2.配置文件形式
  • [DEFAULT]
    ServerAliveInterval = 45
    Compression = yes
    CompressionLevel = 9
    ForwardX11 = yes
      
    [callhsr.top]
    User = hg
      
    [topsecret.server.com]
    Port = 50022
    ForwardX11 = no
 
  3.创建文件
  • 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 configfile:
    
       config.write(configfile)
 
  4.查找文件
  • import configparser
    
    config = configparser.ConfigParser()
    
    #---------------------------查找文件内容,基于字典的形式
    
    print(config.sections())        #  []
    
    config.read('example.ini')
    
    print(config.sections())        #   ['bitbucket.org', 'topsecret.server.com']
    
    print('bytebong.com' in config) # False
    print('bitbucket.org' in config) # True
    
    
    print(config['bitbucket.org']["user"])  # hg
    
    print(config['DEFAULT']['Compression']) #yes
    
    print(config['topsecret.server.com']['ForwardX11'])  #no
    
    
    print(config['bitbucket.org'])          #<Section: bitbucket.org>
    
    for key in config['bitbucket.org']:     # 注意,有default会默认default的键
        print(key)
    
    print(config.options('bitbucket.org'))  # 同for循环,找到'bitbucket.org'下所有键
    
    print(config.items('bitbucket.org'))    #找到'bitbucket.org'下所有键值对
    
    print(config.get('bitbucket.org','compression')) # yes       get方法Section下的key对应的value

     

  5.改删查
  • import configparser
    
    config = configparser.ConfigParser()
    
    config.read('example.ini')
    
    config.add_section('yuan')
    
    
    
    config.remove_section('bitbucket.org')
    config.remove_option('topsecret.server.com',"forwardx11")
    
    
    config.set('topsecret.server.com','k1','11111')
    config.set('yuan','k2','22222')
    
    config.write(open('new2.ini', "w"))

     

三、logging
  1.  logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等
 
  2.认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG),默认的日志格式为日志级别:Logger名称:用户输出消息。
 
  3.简单的使用
  • logging.warnning('warning message')

     

  4.basicconfig
  • #basicconfig中文会乱码,可以通过在源码里直接将编码改成utf-8
    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')
    
    配置参数:
    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用户输出的消息

     

  5.配置log对象
  • 配置log对象
    import logging
    
    logger = logging.getLogger()
    # 创建一个handler,用于写入日志文件
    fh = logging.FileHandler('test.log',encoding='utf-8')
    
    # 再创建一个handler,用于输出到控制台
    ch = logging.StreamHandler()
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    
    fh.setLevel(logging.DEBUG)
    
    fh.setFormatter(formatter)
    ch.setFormatter(formatter)
    logger.addHandler(fh) #logger对象可以添加多个fh和ch对象
    logger.addHandler(ch)
    
    logger.debug('logger debug message')
    logger.info('logger info message')
    logger.warning('logger warning message')
    logger.error('logger error message')
    logger.critical('logger critical message')

     

 
 
 
 
 
 
 
 
 
 

转载于:https://www.cnblogs.com/walthwang/p/10403015.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33743880/article/details/94710780

智能推荐

通信协议 CRC校验和计算方法_crc 0x43-程序员宅基地

文章浏览阅读3.8k次。public static uint CalCrc16(byte[] buf, int start, int end) { byte CRC16Lo, CRC16Hi; //CRC寄存器 byte CL, CH; //多项式码&HA001 byte SaveLo, SaveH_crc 0x43

mysql关系型和非关系型区别,关系型数据库和非关系型数据区别-程序员宅基地

文章浏览阅读138次。表是关系型数据库最典型的数据结构,它由两维的表和它们之间的联系组成数据组织。好处:易于维护:均采用表结构,格式一致;使用方便: SQL语言是通用的,可以用于复杂的查询;第三,复杂操作:支持 SQL,可以在一个表和多个表之间进行复杂查询。缺陷:读写性能相对较差,特别是对海量数据的高效读写;固定的表格结构,弹性稍差一点;在传统关系型数据库中,硬盘 I/O的并发程度较高,读写需求也较大。严格地说,非关系..._mysql关系型数据库与非关系型的区别

Vue中一些工具的应用(仅供参考具体看API文档)_at function.invokegetter-程序员宅基地

文章浏览阅读396次。vue-cli中常见插件的使用及配置配置echars安装npm install echarts -S在组件中定义图表容器并初始化数据 // 假设是 index.vue // 1. 在template中的html标签中定义容器 <div id="echarsbox" :style="{width: '300px', height: '300px'}"></div>..._at function.invokegetter

简单两步实现 rsync 自动同步文件免密_rsync无需输入密码远程同步文件-程序员宅基地

文章浏览阅读3.2k次,点赞2次,收藏6次。rsync 免密方式自动同步文件:rsync的客户端方式能够自动同步文件,非常方便,但是它在远程拷贝文件之前提示还需要输入一个密码,要实现脚本自动拷贝,必须要优化掉这个步骤,让rsync以密码文件的方式工作,就不需要再手工输入密码了,但密码文件的方式工作需要两步简单的配置。环境说明:suse安装后自带rsync命令程序,使用最简单的客户端方式工作。备份机:192.168.0.1, 同步文件的目的地。服务器:192.168.0.8, 同步文件的数据源,一般是从服务器拷贝数据去备份。.._rsync无需输入密码远程同步文件

command failed: npm install --loglevel error --legacy-peer-deps-程序员宅基地

文章浏览阅读2k次。1,没有安装webpack,安装一下就好了npm install webpack -g2,node版本冲突,重新安装一下持久维护版然后就成功了_command failed: npm install --loglevel error --legacy-peer-deps

prometheus监控zookeeper-程序员宅基地

文章浏览阅读2k次。1、部署zookeeper# 节点192mkdir -p /data/zookeeper/{data,conf,log}#zookeeper配置文件cat > /data/zookeeper/conf/zoo.cfg << 'EOF'#4lw.commands.whitelist=*4lw.commands.whitelist=mntr,ruokclientPort=2181 dataDir=/data/zookeeper/datadataLogDir=/data/zo_prometheus监控zookeeper

随便推点

Unity使用SteamVR2.0实现基本功能(瞬移,抓取物品,射线点击,UI交互等)_interact with ui-程序员宅基地

文章浏览阅读1.3w次,点赞76次,收藏224次。SteamVR2.0 学习基本功能使用,清楚各个组件的功能和参数,了解SteamVR的代码逻辑_interact with ui

python怎么画图片 wafer map_Python wafer_map包_程序模块 - PyPI - Python中文网-程序员宅基地

文章浏览阅读2k次。晶圆图绘制一张晶圆图。用于半导体加工和分析。内容安装用法键盘快捷键和鼠标用法rel="nofollow">键盘快捷键和鼠标用法注意事项当前能力更改日志功能鼠标和键盘快捷键!知道半M1-0302晶圆尺寸!你可以改变颜色!放大缩小!在你自己的wxpython应用程序中使用它!查看模具网格坐标、绝对坐标和模具值!(但只有如果您使用独立应用程序或您的应用程序有状态栏)。你想怎么做就怎么把地图放在晶圆上!安..._python晶圆图

redis学习总结_redis是cp还是ap-程序员宅基地

文章浏览阅读1.2k次。redis数据结构原理待整理~redis持久化RDB持久化1.执行流程父进程执行fork操作创建子进程,这个过程中父进程是阻塞的,Redis不能执行来自客户端的任何命令。子进程创建RDB文件,根据父进程内存快照生成临时快照文件,完成后对原有文件进行原子替换,替换后子进程信号通知主进程2.rdb自动持久化配置:时间策略要按照实际情况配置多条,数据的存储时不均匀的,高峰期短时间间隔要存一次,低峰期长时间间隔要存一次。# 文件名称dbfilename dump.rdb# 时间策略sa_redis是cp还是ap

【实习日报】2019年6月上半月 前端开发实习工作日报汇总_前端日报十字-程序员宅基地

文章浏览阅读3.4k次,点赞3次,收藏16次。以下记录的是今年6月1日-6月15日笔者在公司进行web前端工作的每日工作内容,其中隐去了项目的具体名称、人名、公司名等。2019.6.3今天完成的任务:发布了一个野牛期货PC客户端的新版本,新增快捷键设置功能,已将代码提交至个人仓库中,暂未发起pull request请求。目前已知bug:当设置快捷键时,如果设置的快捷键是全局热键:也就是屏幕截图,老板键,打开/隐藏主窗口时,如果只键..._前端日报十字

备份文件后缀_linux 备份文件以什么结尾-程序员宅基地

文章浏览阅读5.5k次。常见的备份文件后缀名有 .git .svn .swp .~ .bak .bash_history一个一个试,发现是.bak,最后下载.bak后用记事本打开,获得flag_linux 备份文件以什么结尾

频谱 相位谱互谱_matlab互谱分析-程序员宅基地

文章浏览阅读5.8k次,点赞2次,收藏18次。第一:频谱一.调用方法X=FFT(x);X=FFT(x,N);x=IFFT(X);x=IFFT(X,N)用MATLAB进行谱分析时注意:(1)函数FFT返回值的数据结构具有对称性。例:N=8;n=0:N-1;xn=[4 3 2 6 7 8 9 0];Xk=fft(xn)→Xk =39.0000 -10.7782 + 6.2929i ..._matlab互谱分析

推荐文章

热门文章

相关标签