23、常用模块二

一、json与pickle模块

1.1、什么是序列化和反序列化

  内存中的数据类型====》序列化====》特定的格式(json格式或者pickle格式)

  特定的格式(json格式或者pickle格式)====》反序列化====》内存中的数据类型

  土办法:

 {'aaa':111}--->序列化str({'aaa':111})----->"{'aaa':111}"
  {'aaa':111}<---反序列化eval("{'aaa':111}")<-----"{'aaa':111}"

1.2、为什么要序列化

  序列化得到的结果====》特定的格式的内容有两种用途

  1.用于存储====》可以存档    

    使用途径 :可以是一种专用的格式,pickle只能在python上识别

  2.传输给其他平台====》用来跨平台数据交互

    使用途径:应该是一种通用的格式,json是一种可以被所有语言识别的格式

1.3、怎么使用序列化和反序列化

1.3.1、序列化     json。dumps()

json_res=json.dumps([1,'aaa',True,False])
# print(json_res,type(json_res)) # "[1, "aaa", true, false]"

1.3.2、反序列化    json.loads()

l=json.loads(json_res)
print(l,type(l))

二、configparser   模块

  该模块适用于配置文件的格式与Windows ini文件相似,可以包含一个或者多个标题(section),每个节可以有多个参数(key=value)

 

import configparser

config=configparser.ConfigParser()
config.read('test.ini')      #  test。ini为python文件,里面的格式为节下面包含key=value

2.1、查看所有标题    config.sectiongs()

print(config.sections())

2.2、获取某个section下的所有内容    config.sectiongs(*)以列表形式

print(config.options('section1'))    #['k1', 'k2', 'user', 'age', 'is_admin', 'salary']

2.3、获取字典item       config.items()

print(config.items('section1'))   #[('k1', 'v1'), ('k2', 'v2'), ('user', 'egon'), ('age', '18'), ('is_admin', 'true'), ('salary', '31')]

2.4、获取某个section下面,指定key对应value的值,并且以字符串的形式表示     config.get('section','key')

#查看标题section1下user的值=>字符串格式
val=config.get('section1','user')
print(val) #egon

  2.5、获取某个section下面,指定key对应value的值,并且以数字的形式表示    config.getint('section','key')

#查看标题section1下age的值=>整数格式
val1=config.getint('section1','age')
print(val1) #18

2.6、获取某个section下面,指定key对应value的值,并且以布尔值的形式表示    config.getboolrean('section','key')

#查看标题section1下is_admin的值=>布尔值格式
val2=config.getboolean('section1','is_admin')
print(val2) #True

2.7、获取某个section下面,指定key对应value的值,并且以浮点型的形式表示   config.getfloat('section','key')

#查看标题section1下salary的值=>浮点型格式
val3=config.getfloat('section1','salary')
print(val3) #31.0

三、hashlib模块

3.1、什么是哈希hash

  hash是是一种算法,该算法接收传入的值的内容,经过运算得到一串的hash值

  hash的特点:

        1.只要传入的值一致,得到的hash值也是一致的

        2.得到的hash值不能返回成原值

        3.不管传入的值有多大,只要hash算法不变,hash长度都是一致的

3.2、hash的用途

  1.无法返回原值的特性可以作为密码密文的传输与验证

  2.长度以及内用不变性,可以作为文件完整性的检验

3.3、hash怎么用

  先设定hash的类型,在使用  变量.update(str.encode())进行添加,   最后变量.hexdigest生成hash值

import hashlib
m=hashlib.md5()   #md5是hash的类型
m.update('hello'.encode('utf-8'))   #使用update添加
m.update('world'.encode('utf-8'))
res=m.hexdigest() # 'helloworld'      #生成hash值
print(res)

  只要是同样的内容,最终会生成同样的hash值

m1=hashlib.md5('he'.encode('utf-8'))
m1.update('llo'.encode('utf-8'))
m1.update('w'.encode('utf-8'))
m1.update('orld'.encode('utf-8'))
res=m1.hexdigest()# 'helloworld'
print(res)

3.4、模拟撞库

  先知道一个hash值,设置一系列的密码,将密码生成hash值,通过对比hash值是否一致,得到密码

passwds=[
    'alex3714',
    'alex1313',
    'alex94139413',
    'alex123456',
    '123456alex',
    'a123lex',
]                       #先设定可能的密码

dic={}              #设置空字典
for p in passwds:    #循环
    res=hashlib.md5(p.encode('utf-8'))    #将可能的密码转换成hash值
    dic[p]=res.hexdigest()  #    存入字典中

# 模拟撞库得到密码
for k,v in dic.items():
    if v == cryptograph:     #找到的hash值
        print('撞库成功,明文密码是:%s' %k)
        break    

  提升撞库的难度====》密码加盐

  提高密码的复杂性

import hashlib
m=hashlib.md5()
m.update('天王'.encode('utf-8'))
m.update('alex3714'.encode('utf-8'))
m.update('盖地虎'.encode('utf-8'))
print(m.hexdigest())

四、subprocess模块

  调用操作系统的命令    subprocess。Popen

import subprocess
判断操作系统中是否存在该文件
obj=subprocess.Popen('echo 123 ; ls / ; ls /root',shell=True,
                 stdout=subprocess.PIPE,    #正确则执行
                 stderr=subprocess.PIPE,    #错误则执行
                 )

print(obj)      #<subprocess.Popen object at 0x00000168D72C0A90>
res=obj.stdout.read()    
print(res.decode('utf-8'))    #123 ; ls / ; ls /root
 
err_res=obj.stderr.read()      #该文件存在,则无输出
print(err_res.decode('utf-8'))    

 

posted @ 2020-03-31 21:37  疏星淡月  阅读(175)  评论(0编辑  收藏  举报