Python之第二十七天的努力--pickle、hashlib模块
2021-04-29 12:27
标签:odi 内容 == 步骤 pass 模块 方法 range c中 md5().... Python之第二十七天的努力--pickle、hashlib模块 标签:odi 内容 == 步骤 pass 模块 方法 range c中 原文地址:https://www.cnblogs.com/szheng/p/13232867.html01 pickle模块:一次性写入,一次性读取
序列化
‘‘‘
pickle:
将Python中所有的数据类型。转换成字节串,序列化过程
将字节串转换成Python中数据类型,反序列化过程。
‘‘‘
import pickle
# 所有的数据类型都可以进行序列化
# bys = pickle.dumps([1, 2, 3])
# print(type(bys)) #
把pickle序列化内容写入文件中
# 把pickle序列化内容写入文件中
with open(‘c.txt‘,mode=‘wb‘) as f:
pickle.dump([1,2,3],f)
# 从文件中反序列化pickle数据
with open(‘c.txt‘,mode=‘rb‘) as f1:
res = pickle.load(f1)
print(type(res)) #
对pickle数据多次操作
# 多次把pickle数据写入到同一文件中
with open(‘c.txt‘,mode=‘ab‘) as f:
pickle.dump([1,2,3],f)
pickle.dump([1,2,3],f)
pickle.dump([1,2,3],f)
# 从文件中反序列化pickle数据
with open(‘c.txt‘,mode=‘rb‘) as f1:
for x in range(4):
res = pickle.load(f1)
print(res)
02 json与pickle比较
# json与pickle比较:
‘‘‘
json:
1.不是所有的数据类型都可以序列化。
2.不能多次对同一文件序列化。
3.json数据可以跨语言
pickle:
1.所有的Python类型都能序列化,结果为 字符 串。
2.可以多次对同一文件序列化。
3.不能跨语言。
‘‘‘
03 hashlib模块
封装一些用于加密的类。
加密的目的:用于判断和验证,而并非解密。
特点:
md5加密算法
‘‘‘
md5加密算法:
给一个数据加密的三大步骤:
1.获取一个加密对象。
2.使用加密对象的update,进行加密,update方法可以调用多次
3.通常通过hexdigest获取加密结果,或digest()方法。
‘‘‘
import hashlib
# 获取一个加密对象
m = hashlib.md5()
# 使用加密对象的update,进行加密
# m.update(b‘abc‘)
m.update(‘abc中文‘.encode(‘utf-8‘))
# 通过hexdigest获取加密结果
res = m.hexdigest()
print(res) # 1af98e0571f7a24468a85f91b908d335
# res = m.digest()
# print(res) # b‘\x1a\xf9\x8e\x05q\xf7\xa2Dh\xa8_\x91\xb9\x08\xd35‘
# 给一个数据加密。
# 验证:用另一个数据加密的结果和第一次加密的结果对比。
# 如果结果相同,说明原文相同。如果不相同,说明原文不同。
不同加密算法的区别
# 不同加密算法:实际上就是加密结果的长度不同;
s = hashlib.sha224()
s.update(b‘abc‘)
print(s.hexdigest()) # 23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7
print(len(hashlib.md5().hexdigest())) # 32
print(len(hashlib.sha224().hexdigest())) # 56 56*4=224
print(len(hashlib.sha256().hexdigest())) # 64 64*4=256
其他
# 创建加密对象时,可以指定参数,称为salt。
m = hashlib.md5(b‘abc‘)
print(m.hexdigest()) # 900150983cd24fb0d6963f7d28e17f72
m = hashlib.md5()
m.update(b‘abc‘)
print(m.hexdigest()) # 900150983cd24fb0d6963f7d28e17f72
# 拆分成不同小块
m = hashlib.md5()
m.update(b‘abcdef‘) # e80b5017098950fc58aad83c8c14978e
print(m.hexdigest())
m = hashlib.md5()
m.update(b‘abc‘)
m.update(b‘def‘)
print(m.hexdigest()) # e80b5017098950fc58aad83c8c14978e
练习
# 练习:
# 登录注册程序
def get_md5(username,password):
m = hashlib.md5()
m.update(username.encode(‘utf-8‘))
m.update(password.encode(‘utf-8‘))
return m.hexdigest()
def register(username,password):
# 加密
res = get_md5(username,password)
# 写入文件
with open(‘login‘,mode=‘at‘,encoding=‘utf-8‘) as f:
f.write(res)
f.write(‘\n‘)
def login(username,password):
# 获取当前登录信息的加密结果
res = get_md5(username, password)
# 读文件,和其他的数据进行对比
with open(‘login‘,mode=‘rt‘,encoding=‘utf-8‘) as f:
for line in f:
if res == line.strip():
return True
else:
return False
def main():
while 1:
op = int(input(‘1.注册 2.登录 3.退出‘))
if op == 1:
username = input(‘输入用户名:‘)
password = input(‘输入密码:‘)
register(username,password)
elif op == 2:
username = input(‘输入用户名:‘)
password = input(‘输入密码:‘)
res = login(username,password)
if res:
print(‘登录成功‘)
else:
print(‘登录失败‘)
elif op == 3:
break
if __name__ == ‘__main__‘:
main()
文章标题:Python之第二十七天的努力--pickle、hashlib模块
文章链接:http://soscw.com/index.php/essay/80117.html