zoukankan      html  css  js  c++  java
  • 模块 hashlib(算法) configparser(配置) logging(日志)

     

    json 补充

    3.1 hashlib 加密,摘要算法

    3.2 configparser 配置文件

    3.3 logging  模块

    json字符串和python 字符串到底差在什么地方?

    json字符串在数据最外面始终是单引号引起来的.

    json字符串如果数据是容器类的数据类型,且里面有字符串,字符串一定是双引号引起来的.

    而python   "{'alex':'wusir'}"  不区分单双引号.

    对于单独的字符串:

    python显示:  "alex"    不区分单双引号

    json显示:  ' "alex" '  外面还有一个单引号

     3.1 hashlib:hash:算法,结果是内存地址.

    hashlib 模块与加密相关,实际上他是摘要算法.

    1. hashlib 是一堆算法的合集,它包含很多算法(加密的).

    2.hashlib 的过程就是将字符串转化成  一串由数字和字母组合的字符串的过程.(经过hashlib转化的结果是等长的)

    3.hashlib对相同的字符串转化成的()数字加字母)是相同的

    4. 不同的电脑对相同的字符串进行加密,转化成的数字相同.

    hashlib 用在哪里?

    1.密文(密码):将密码用算法加密放置到数据库.每次取出验证.

    2. 文件的校验

    初识 hashlib 

    import  hashlib

    #md5  加密算法, 常用算法,可以满足一般的常用需求.

    #sha 1(有好几个等级) : 加密算法,级别高一些,数字越大级别越高,加密的效率越低,越安全.

    #md5

    s = "123456"

    ret = hashlib.md5()  #创建一个md5对象

    ret.update(s.encode("utf-8"))  #调用次update方法对参数进行加密bytes类型

    print(ret.hexdigest())  #得到加密后的结果  定长

    s2 = "dflajfldajkldjfljsejfl;jef;laeja;j;lajld"

    ret = hashlib.md5()  #创建一个md5对象

    ret.update(s2.encode("utf-8"))  #调用次update方法对参数进行加密bytes类型

    print(ret.hexdigest())  #得到加密后的结果 定长

    s3 = "dflajfldajkldjfljsejfl;jef;laeja;j;lajle"

    ret = hashlib.md5()  #创建一个md5对象

    ret.update(s3.encode("utf-8"))  #调用次update方法对参数进行加密 bytes类型

    print(ret.hexdigest())  #得到加密后的结果  定长

    s2 和s3就只有一个字母不一样,得到加密后的结果也是大不一样.

    无论字符串多长,返回都是定长的(数字和字符串)

    同一字符串,md5值相同.

    黑客:将你常用的密码 000000    111111  等.对应的md5关系表给打印出来,因此就会有可能破解密码.

    撞库:因为撞库,所以相对不安全,如何解决?

    import hashlib

    s = "123456"

    ret = hashlib.md5()

    ret.update(s.encode("utf-8")

    print(ret.hexdigest())

    解决方式:加盐

    s1 = "123456"

    ret = hashlib.md5("&&%%$".encode("utf-8"))  #创建一个md5对象,加盐

    ret.update(s1.encode("utf-8"))  #调用此update方法对参数进行加密bytes类型

    print(ret.hexdigest())  #得到加密后的结果 定长

    如果黑客盗取到固定的盐,"&&%%$"内容,还是会破解密码

    变成随机的盐:

    import hashlib

    username= "ajdklfja"

    password = "123456"

    ret = hashlip.md5(username[::-2].encode("utf-8"))

    ret.update(password.encode("utf-8"))

    print(ret.hexdigest())

    sha 系列

    hashlib.sha1()   #sha1与md5级别相同,但是sha1比md5更安全一些,因为sha1用得少.

    import hashlib

    ret = hashlib.sha1()

    ret.update("122345".encode("utf-8"))

    print(ret.hexdigest())

    ret = hashlib.sha512()  #级别最高,效率低,安全性最大

    ret.update("123456".encode("utf-8"))

    print(ret.hexdigest())

    文件的校验: 

    def  func(file_name):

      with open(file_name,mode="rb")as f:  #用rb模式,文件里的内容就不需要再编译成bytes类型了.

        ret = hashlib.md5()

        ret.update(f.read())  #因为文件使用rb模式打开的所以这里不用编译成bytes类型

        return  ret.hexdigest()

    print(func("hashlib_file"))

    print(func("hashlib_file"))

    上面的代码对于小文件可以(f.read()是一次性读取文件)但是超大的文件,内存就受不了.

    import hashlib

    s = "我爱你中国,我是地球人.也是亚洲人,更是中国人"

    ret = hashlib.md5()

    ret.update(s.encode("utf-8"))

    print(ret.hexdigest())

    get = hashlib.md5()

    get.update(s[0:10].encode("utf-8"))

    get.update(s[10:].encode("utf-8"))

    print(get.hexdigest())

    两次打印的结果是一样的

    def  func(file_name):

      with open(file_name,mode="rb")as f:

        ret = hashlib.md5

        #for i in f:  #这个方法跟下面的方法得到的结果一样.

        #  ret.update(i)

        #return ret.hexdigest()

        while  True:

          content = f1.read(1024)

          if content:

            ret.update(content)

          else:

            break

        return  ret.hexdigest()

    print(func("hashlib_file"))

    print(func("hashlib_file"))

    hashlib :用在密文(密码),或者文件的校验.

    md5:普通的,   加盐的  ,  动态加盐的

    sha系列: 普通的 , 加盐的, 动态加盐的

    文件的校验:小文件,大文件.

    3.2 configparser  (配置文件)(了解):放置一些常用的变量(以 .ini 结尾)

    configparser 帮助操作(创建,增加,删,改,查)一个配置文件.

    创建一个文件:

    import  configparser

    config = configparser.ConfigParser()

    config['DEFAULT'] = {"ServerAliveInerval":"45",

              'Compression':"yes",

              'ComperssionLevel':"9",

              'ForwardXl1':'yes'

              }

    config['bitbucket.org'] = {"user":"hg"}

    config['topsecret.server.com'] = {'Host Port' : '45345','ForwardXl1' : 'no'}

    with open("example.ini","w")as f:

      config.write(f)

    以上操作便是创建一个example.ini的配置文件

    import configparser

    config = configparser.ConfigParser()

    查找内容,基于字典的形式.

    print(config.sections()) #打印出 []  空列表.

    config.read("example.ini")#顺序:创建一个对象,然后将文件读到内存中,再进行相应的操作.

    print(config.sections())#就会打印出文件的sections

    #打印的结果为什么没有DEFAULT?因为他是特殊的,可以看做成一个全局的.

    print("111"  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"]["ForwardXl1"])#no

    print(config["bitubcket.org"])#输出的是一个可迭代器

    print(config["bitbucket.org"]["forwardxl1"])#yes

    for key in config['bitbucket.org']#注意有default会默认default的键,意思就是default也能打印出来

      print(key)

    print(config.options('bitbucket.org'))#同for循环,找到"bitbucket.org"下所有的键

    print(config.items("bitbucket.org"))#找到"bitbucket.org"下所有的键值对,包括DEFAULT下的

    print(config.get("bitbucket.org","compression"))#yes    get方法Section下的key对应的value

    增删改

    import configparser

    config = configparser.ConfigParser()

    config.read("new2.ini")

    config.add_section("日天")

    config.remove_section("bitbucket.org")

    config.remove_option("topsecret.server.com'',"forwardxl1")

    config.set("topsecret.server.com","k1","1111")

    config.set("yuan","k2","22222")

    config.write(open("new2.ini","w")

    log  日志: 

    什么时候用到日志?

    生活中:

    1.公司员工信息工号等等需要日志.

    2.淘宝,京东 你的消费信息,浏览记录等等都记录日志中,个性化推荐.

    3.头条个性化设置(爱好记录的日志中)

    等等

    工作上:

    运维人员,任何员工对服务器做过的任何操作,都会记录到日志中.如果你要是从事运维开发的工作,各处都需要日志.

    debug模式,需要依靠日志的,

    定时收集信息,也要记录日志.

    logging 模块是辅助你记录日志的,不是自动记录日志的.

    低配版,logging

    高配版,logger  对象

    低配版,logging

    import logging

    等级是一层一层升高的.

    logging.basicConfig(level=logging.DEBUG)

    level = logging.DEBUG设置显示报错的级别

    logging.debug("debug message") #调试信息

    logging.info("info message")#正常信息

    logging.warning("warning message")#警告信息:代码虽然不报错,但是警告写的不规范,必须改

    logging.error("error message")#错误信息

    logging.critical("critical  message")#严重错误信息

    用法实例:

    try:

      num = input("<<<<")

      num = int(num)

    except ValueError:

      logging.error("出现了%s"%ValueError)

    1.调整格式.(完善报错信息)

    logging.basicConfig(level = logging.DEBUG,

              format = "%(asctime)s %(filename)s (line:%(lineno)d) %(levelname)s %(message)s",

    )

    logging.debug("debug message")

    logging.info("info  message")

    logging.warning("warning  message")

    logging.error("error message")

    logging.critical("critical  message")

    logging.basicConfig(level= logging.DEBUG,

              format = "%(astime)s %(filename)s (line:%(lineno)d) %(levelname)s %(message)s",

              datefmt = "%a, %d %b %Y %H:%M:%S:,    #设置时间格式

              filename = "low_logging.log", #设置文件名

              filemode = "w"  #设置写入模式

                )

    logging.warning("warning message")

    logging.error("error message")

    logging.critical("critical message")

    try:

      num = input("<<<<")

      num = int(num)

    except Exception as e:

      logging.warning(e)

      logging.error(e)

      logging.critical(e)

    低配版 logging 缺点:

    1.写入文件打印日志不能同时进行

    2.写入文件时文件编码方式为gbk

  • 相关阅读:
    Prometheus入门教程(二):Prometheus + Grafana实现可视化、告警
    Prometheus 入门教程(一):Prometheus 快速入门
    Prometheus 系列开篇:为什么要学 Prometheus ?
    你总是遗憾,是因为你还没想好,你的一生想怎么过!
    搞 Java 的年薪 40W 是什么水平?
    闪送,为何能从顺丰中杀出一条血路?
    安全攻击溯源思路及案例
    Windows下登录凭证窃取技巧
    Linux下登录凭证窃取技巧
    如何探测内网存活主机
  • 原文地址:https://www.cnblogs.com/fengkun125/p/9278279.html
Copyright © 2011-2022 走看看