haslib
模块为不一样的安全哈希/安全散列(Secure Hash Algorithm)和信息摘要算法(Message Digest Algorithm)实现了一个公共的、通用的接口。haslib模块提供了不少算法的函数实现,例如:md五、sha一、sha22四、sha25六、sha38四、sha512等。
此处简单介绍下集中数据加密方式html
数据加密方式 | 描述 | 主要解决问题 | 经常使用算法 |
---|---|---|---|
对称加密 | 数据加密和解密使用相同的密钥 | 数据的机密性 | DES,AES |
非对称加密 | 也叫公钥加密,指数据加密和解密使用不一样的密钥(密钥对) | 身份验证 | DSA,RSA |
单向加密 | 只能加密数据,不能解密数据 | 数据的完整性验证 | MD5,SHA系统算法 |
摘要算法又称哈希算法、散列算法。它经过一个函数,把任意长度的数据转换为一个长度固定的字符串(一般用16进制字符串表示)。经常使用的是md5
算法。
hashlib模块对应的属性和函数python
hselib.new(name[, date])
通用的哈希对象构造函数,用于构造指定的哈希算法对应的哈希对象。其中name
用于指定哈希算法名称,如md5
、sha1
,不区分大小写;data
可选,表示初始数据。web
1 2 3 |
>>> import hashlib >>> hashlib.new('md5') #构建hash对象 <md5 HASH object @ 0x00000131AE948AD0> |
hashlib.算法名称()
能够直接经过具体的哈希算法名称对应的函数获取哈希对象,如hashlib.md5()等。
hashlib.md5()和hashlib.new(‘md5’)是等价的。算法
1 2 3 |
>>> import hashlib >>> hashlib.md5() <md5 HASH object @ 0x00000131AE9489E0> |
hashlib.algorithms_guaranteed
它的值是该模块在全部平台都支持的哈希算法的名称集合。json
1 2 3 |
>>> import hashlib >>> hashlib.algorithms_guaranteed {'sha384', 'blake2b', 'sha3_384', 'shake_128', 'sha3_256', 'sha3_224', 'md5', 'sha3_512', 'blake2s', 'sha224', 'shake_256', 'sha256', 'sha512', 'sha1'} |
hashlib.algorithms_available
当前运行python解释器中可用的哈希算法的集合。algorithms_guaranteed
是它的子集。缓存
1 2 3 |
>>> import hashlib >>> hashlib.algorithms_available {'md4', 'sha3_384', 'shake_128', 'whirlpool', 'SHA224', 'blake2s', 'ripemd160', 'MD4', 'sha1', 'sha384', 'SHA384', 'ecdsa-with-SHA1', 'md5', 'SHA256', 'DSA-SHA', 'SHA1', 'sha3_512', 'shake_256', 'sha', 'sha256', 'sha512', 'DSA', 'RIPEMD160', 'blake2b', 'dsaEncryption', 'SHA512', 'sha3_224', 'sha224', 'SHA', 'sha3_256', 'MD5', 'dsaWithSHA'} |
hash对象对应的属性和方法安全
m.update(a);m.update(b)
等价于m.update(a+b)
。hash.digest()
方法返回结果的字符串长度。该值对于哈希对象是固定的。md5:16,sha1:20, sha224:28。hashlib.new()
函数来建立另一个同类型的哈希对象。 1 2 3 4 5 6 7 8 9 10 11 12 13 |
>>> import hashlib >>> m = hashlib.md5() #建立hash对象 >>> m.update('hello world'.encode('utf-8')) #更新hash对象的计算数据 >>> print(m) <md5 HASH object @ 0x00000131AE9489E0> >>> print(m.hexdigest()) #返回对应数据摘要信息(十六进制) 5eb63bbbe01eeed093cb22bb8f5acdc3 >>> print(m.digest()) #返回对应数据摘要信息(二进制) b'^\xb6;\xbb\xe0\x1e\xee\xd0\x93\xcb"\xbb\x8fZ\xcd\xc3' >>> print(m.name) #返回使用的哈希算法 md5 >>> print(m.digest_size) #返回字符串长度 16 |
注意点:服务器
hash.hexdigest()
。hashlib.md5()
建立哈希对象;经过update()
追加须要计算的数据;经过hexdigest()
获得数据对应的十六进制字符串(也就是摘要信息)。 StringIO
主要用来在内存中写入字符串及字符串的缓存。其接口和文件操做的接口是一致的,基本全部关于文件的方法均可以用。 1 2 3 4 5 6 |
>>> from io import StringIO >>> s = StringIO() #初始化StringIO对象 >>> s.write('hello world') #写入字符串 11 >>> s.getvalue() #获取实例中的字符串 'hello world' |
stringIO.getvalue()
返回StringIO实例中的字符串。
读取StringIO中的字符串,也可使用文件相似的read
、readline
、readlines
等方法。网络
1 2 3 4 5 6 7 8 9 10 11 12 13 |
>>> s = StringIO() >>> s.write('hello world') 11 >>> s.write('\n new line') 10 >>> s.seek(0) #回到文件开头 0 >>> for line in s: ... print(line) ... hello world new line |
StringIO
操做只能是str
,若是要操做二进制数据,就须要使用BytesIO
。
BytesIO
实现了在内存中读写bytes。函数
1 2 3 4 5 6 7 8 9 10 11 12 |
>>> from io import BytesIO >>> f = BytesIO() >>> f.write('中文'.encode('utf-8')) 6 >>> print(f.getvalue()) b'\xe4\xb8\xad\xe6\x96\x87' >>> f.seek(0) #回到文件最开头 0 >>> f.read() #读取 b'\xe4\xb8\xad\xe6\x96\x87' >>> '中文'.encode('utf-8') #读取的内容和写入的对比 b'\xe4\xb8\xad\xe6\x96\x87' |
此处写入的内容不是中文
字符串,而是通过UTF-8编码的bytes。
Json(JavaScript Object Notation),它是一种轻量级的数据交换格式。其应用最普遍的是做为AJAX中web服务器和客户端的通信的数据格式,如今也经常使用于http请求。
1 2 3 4 |
#序列化:将python对象转换成json字符串 dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw) #反序列化:将json字符串转换成python对象 loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw) |
将序列化后获得的json数据保存到文件以及直接读取文件中的json数据进行反序列化操做
1 2 3 4 |
#序列化:将python对象转换成json字符串并存储到文件 dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw) #反序列化:读取指定文件中的json字符串并转换成python对象 load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw) |
json和python数据类型对应关系
Python | JSON |
---|---|
dict | object |
list,tuple | array |
str | string |
int,float,int- & float-derived Enums | number |
True | true |
False | false |
None | null |
JSON | Python |
---|---|
object | dict |
array | list |
string | str |
number(int) | int |
number(real) | float |
true | True |
false | False |
null | None |
序列化示例
1 2 3 |
>>> import json >>> json.dumps({'a':'str', 'c': True, 'e': 10, 'b': 11.1, 'd': None, 'f': [1, 2, 3], 'g':(4, 5, 6)}) '{"a": "str", "c": true, "e": 10, "b": 11.1, "d": null, "f": [1, 2, 3], "g": [4, 5, 6]}' |
sort_keys
参数: 表示序列化时是否对dict的key进行排序(dict默认是无序的)
1 2 |
>>> json.dumps({'a':'str', 'c': True, 'e': 10, 'b': 11.1, 'd': None, 'f': [1, 2, 3], 'g':(4, 5, 6)}, sort_keys=True) '{"a": "str", "b": 11.1, "c": true, "d": null, "e": 10, "f": [1, 2, 3], "g": [4, 5, 6]}' |
indent
参数: 表示缩进,它可使得数据存储的格式变得更加优雅、可读性更强;若是indent是一个非负整数或字符串,则JSON array元素和object成员将会被以相应的缩进级别进行打印输出;若是indent是0或负数或空字符串,则将只会插入换行,不会有缩进。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
>>> print(json.dumps({'a':'str', 'c': True, 'e': 10, 'b': 11.1, 'd': None, 'f': [1, 2, 3], 'g':(4, 5, 6)}, sort_keys=True, indent=4)) { "a": "str", "b": 11.1, "c": true, "d": null, "e": 10, "f": [ 1, 2, 3 ], "g": [ 4, 5, 6 ] } |
separators
参数: 尽管indent参数可使得数据存储的格式变得更加优雅、可读性更强,可是那是经过添加一些冗余的空白字符进行填充的。当json被用于网络数据通讯时,应该尽量的减小无用的数据传输,这样能够节省带宽并加快数据传输速度。json模块序列化Python对象后获得的json字符串中的’,’号和’:’号分隔符后默认都会附加一个空白字符,咱们能够经过separators
参数从新指定分隔符,从而去除无用的空白字符。
该参数的值应该是一个tuple(item_separator, key_separator)
1 2 3 4 |
>>> json.dumps({'a':'str', 'c': True, 'e': 10, 'b': 11.1, 'd': None, 'f': [1, 2, 3], 'g':(4, 5, 6)}) '{"a": "str", "c": true, "e": 10, "b": 11.1, "d": null, "f": [1, 2, 3], "g": [4, 5, 6]}' >>> json.dumps({'a':'str', 'c': True, 'e': 10, 'b': 11.1, 'd': None, 'f': [1, 2, 3], 'g':(4, 5, 6)}, separators=(',',':')) '{"a":"str","c":true,"e":10,"b":11.1,"d":null,"f":[1,2,3],"g":[4,5,6]}' |
ensure_ascii
参数: 当该参数的值为True(默认值)时,输出中的全部非ASCII字符(好比中文)都会被转义成’\uXXXX’组成的序列,获得的结果是一个彻底由ASCII字符组成的str实例。若是咱们想获得一我的类可读的输出结果,须要把ensure_ascii参数的值设置为False。
1 2 3 4 5 6 7 |
>>> stu={"name": "小明", "age" : 16} >>> stu_json = json.dumps(stu) >>> print(stu_json) {"name": "\u5c0f\u660e", "age": 16} >>> stu_json01 = json.dumps(stu, ensure_ascii=False) >>> print(stu_json01) {"name": "小明", "age": 16} |
说明:\u5c0f\u660e
是unicode字符对应的内存编码值,该内存编码名称为”unicode-escape”。能够经过unicodestr.encode('unicode-escape')
和decode('unicode-escape')
完成unicode字符串和Unicode内存编码序列进行相互转换。
反序列化示例
1 2 3 4 |
>>> json.loads('{"a": "str", "c": true, "b": 11.1, "e": 10, "d": null, "g": [4, 5, 6], "f": [1, 2, 3]}') {'a': 'str', 'c': True, 'b': 11.1, 'e': 10, 'd': None, 'g': [4, 5, 6], 'f': [1, 2, 3]} >>> json.loads('{"a":"str","c":true,"b":11.1,"e":10,"d":null,"g":[4,5,6],"f":[1,2,3]}') {'a': 'str', 'c': True, 'b': 11.1, 'e': 10, 'd': None, 'g': [4, 5, 6], 'f': [1, 2, 3]} |
load()和dump()
1 2 3 4 5 6 7 8 9 |
#序列化到文件中 >>> with open('test.json', 'w') as fp: ... json.dump({'a':'str中国', 'c': True, 'e': 10, 'b': 11.1, 'd': None, 'f': [1, 2, 3], 'g':(4, 5, 6)}, fp, indent=4) ... #反序列化文件中的内容 >>> with open('test.json', 'r') as fp: ... json.load(fp) ... {'a': 'str中国', 'c': True, 'e': 10, 'b': 11.1, 'd': None, 'f': [1, 2, 3], 'g': [4, 5, 6]} |
注意:若是试图使用相同的fp
调用dump()函数去序列化多个对象,将会产生一个无效的JSON文件。也就是说对于一个fd只能调用一次dump()
。
更多更详细的内容能够点击JSON encoder and decoder查看官网内容。