python22、json与base64与hashlib模块

json与base64与hashlib模块(python常用的模块)
Json模块:(一种数据格式,目前最理想,用于网页前后端的数据交互,交互简单轻量级)
组成键值对的形式,类似于字典
大括号里保存对象,中括号里保存数组
json和dict对比:
1)json的key只能是字符串,dict的key可以是任何可hash的对象,例如:字符串、数字、元组等。

2)json的key可以是有序、重复的;dict的key不可重复;

3)json的value只能是字符串、浮点数、布尔值或者null,或者它们构成的数组或者对象;

4)json任意key存在默认值undefined,dict默认没有默认值;

5)json访问方式可以是[],也可以是.,遍历方式分in,of; dict的value仅仅可以下标访问;

6)json的字符串强制用双引号(数据的封装与解析都是我们自己做的时候,单引号和双引号是没啥关系的,但是如果用到一些别的json相关的库的时候),
dict的字符串可以用单引号、双引号;

7)dict可以嵌套tuple,json里只有数组

8)json:true、false、null

9)dict:True、False、None

10)json中文必须是unicode编码,如“\u6211”

11)json的类型时字符串,字典的类型是dict

目前互联网开发前后端数据交互使用的基本都是json,
比如前端是py字典,不能直接转到后端的json对象所以先转成json字符串再被转成js对象,后台转回前台也是不能少了中间的步骤

json的字符串必须要用双引号包括,值可以是字符串、数字、true、false、null、列表(js叫数组),或字典(js叫对象)
只有中括号数组的json字符串在py的查看格式也是str类型
json模块相当于py转接json的一个转接口,相当于API

json.dumps(python的字典的赋值变量)将python数据转化为json(序列化过程),
python里的元组的小括号也会变成中括号数组,py的true、false、null是开头大写到了js是开头小写
序列化过程:就是把变量从内存中变成可存储或传输的过程,然后反序列化给Java等就可以跨平台进行交互

json.loads(json.dumps(python的字典的赋值变量)的赋值变量)
将json数据转换为python的数据(反序列化过程),未转json前的元组到json变中括号了,再转回py不会变回小括号

都是对字符串操作的,不带s的是对文件操作
print(json.all)查看json模块里的所有方法

json.dumps(obj,indent=4,sort_keys=Ture,ensure_ascii=Ture)
Indent实现缩进,转成js字符后每个键值对都缩进了4(可以调)个字符
sort_keys进行按字母顺序的排序
ensure_ascii 是否用ascii解析

对文件作用的(序列化)
json.dump(obj, fp),obj为py字典,fp为json文件,括号后面也可以写入Indent、sort_keys、ensure_ascii
with open(’文件名.json‘,’w+‘)as fp
把字典转换为json类型,并写入文件中

json.load(fp)(反序列化)
把json文件转换为python数据,不过要先把with中的文件操作改成r,读取处理
with open(’文件名.json‘,’r‘)as fp

Hashlib:(加密技术)可以理解为不可逆的编码
hash结构,这里的hash是散列函数和redis的hash键值对集合不一样
他用一个hash算法把任意长度的数据变成一个长度固定的数据函数
特点:
不能还原、长度相同、修改容易奔溃、同时对两组不一样的数据进行hash处理后得到的结果几乎不可能一样
对于这种高级加密,破解的方式可以用数据库的储存海量钥匙逐个对号来暴力破解,不过较为麻烦
加密方法(调用的hash算法):
1、md5
2、SHA系列:sha1、sha224.。。。。。。(数字越大难度系数越高)
例子:
导入包
然后建立数据a=’154555466‘.encode(),这里的encode()是必须要写的一个编码过程,默认utf-8,否则会报错,就像redis数据需要加charvar
b=hashlib.new(‘md5’,a),生成一个hash对象
c=hashlib.md5(a)生成一个使用md5的hash对象,这里的md5改成sha类型的返回的数据会变长,破解更难
(用new和md5加密其实他算法一样的返回的数据也是一样的,new里面的参数需要些什么类型的加密方法,所以new也是在执行md5只是两种方式生成了两个相同的对象,类似于赋值给不同的变量)
括号里可以不写入a,这样只能生成一个hash对象不会对他进行加密了(只要给数据他,他就会拿来加密)
光是打印只能得到数据的内存地址,所以要
print(Hash对象.hexdigest())返回正规加密的字符串类型,不要hex就是bytes类型

要又简单又安全,不用sha系列也能安全,可以在密码生成过程中统一多加一个数据b=hashlib.new(‘md5’,a) + d,这种方式应用起来需要在hashlib.pbkdf2_hmac()
这里d可以自己设置为和a一样的数据d=’qweasdz‘.encode(),

对密码进行加密:hashlib.pbkdf2_hmac()
hashlib.pbkdf2_hmac(‘md5’,a,d,50),
50是对密码加密的次数

Hash对象.update(arg=None)
c.update(a)对密码进行二次的更新,c=hashlib.md5(a),,a=’154555466‘.encode()

base64模块:
url编码:
一般url只能包含ascll码,但是要避免识别不了非ascll码字符,可以用base64中64个字符来表示二进制数据并将非ascll字符的数据转换成ascll字符
base64.urlsafe_b64encode(s)对url编码,s为需要编码的内容
二进制数据编码:
将不可打印的二进制数据转化为可打印的字符串
base64.b64encode(s)对二进制编码

任何数据都可以用这个编码,但是解码有局限(字符无法解码,编码过程把所有数据当成二进制进行解码了)
baseb64把所有数据都能当他是二进制来加密,解码后他又当他原来是二进制,所以只返回二进制

Base64编码后的数据可能会含有 + / 两个符号,如果编码后的数据用于URL或文件的系统路径中,
就可能导致Bug,所以base模块提供了专门编码url的方法
意思是原本用base64.b64encode(s)不合适于字符,所以用base64.urlsafe_b64encode(s)就可以解决了

猜你喜欢

转载自blog.csdn.net/qwe863226687/article/details/114015496
今日推荐