Python 编程 | 连载 21 -序列化与加密模块

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: Python 编程 | 连载 21 -序列化与加密模块

一、序列化模块

序列化和反序列化的概念如下:

  • 序列化
  • 把不可传输的对象转换成可存储或可传输的过程
  • 把对象信息转换成字符串或者字节串
  • 反序列化
  • 把磁盘等介质中的数据转换成对象
  • 把字符串或者字节串返还为对象

Python中 number、str、list、tuple、dict 都可以进行序列化,其中字典是最常进行序列化的数据结构,注意集合 set 是不能进行序列化的。

json 和 pickle 模块

json模块中的序列化和反序列化的方法

方法 参数 描述 使用 返回值
dumps() obj 对象序列化 json.dumps([1,2]) 字符串
loads() str 反序列化 json.loads('[1,2]') 原始数据类型

pickle模块中的序列化和反序列化的方法

方法 参数 描述 使用 返回值
dumps() obj 对象序列化 json.dumps([1,2]) byte
loads() byte 反序列化 json.loads('[1,2]') 原始数据类型

json 模块和 pickle 模块的序列化和反序列化的函数是一致的,不同的是序列化的返回值和反序列化的参数

import json
a = 1
b = 'stark'
c = ['stark', 'thor', 'banner']
d = (1, 3, 7, 11)
e = {'name': 'stark', 'address': 'NY'}
_a = json.dumps(a)
print(_a, type(_a))
print(json.loads(_a), type(json.loads(_a)))
_b = json.dumps(b)
print(_b, type(_b))
print(json.loads(_b), type(json.loads(_b)))
_c = json.dumps(c)
print(_c, type(_c))
print(json.loads(_c), type(json.loads(_c)))
_d = json.dumps(d)
print(_d, type(_d))
print(json.loads(_d), type(json.loads(_d)))
_e = json.dumps(e)
print(_e, type(_e))
print(json.loads(_e), type(json.loads(_e)))
# bool类型序列化和反序列化
print(json.dumps(True), type(json.dumps(True)))
print(json.loads(json.dumps(True)), type(json.loads(json.dumps(True))))
# None类型
print(json.dumps(None), type(json.dumps(None)))
print(json.loads(json.dumps(None)), type(json.loads(json.dumps(None))))
复制代码

image.png

需要注意的是元组反序列化之后不是元组类型而变成了列表类型。

import json
set_type = {1, 3, 5}
print(type(set_type))
print(json.dumps(set_type), type(json.dumps(set_type)))
复制代码

image.png

集合类型是无法进行序列化的。

使用 try-except处理异常

import json
set_type = {1, 3, 5}
print(type(set_type))
try:
    json.dumps(set_type)
except TypeError as e:
    print(e)
finally:
    print('序列化完毕')
复制代码

image.png

class、function 都无法序列化

import pickle
e = {'name': 'stark', 'address': 'NY'}
_e = pickle.dumps(e)
print(_e, type(_e))
print(pickle.loads(_e), type(pickle.loads(_e)))
复制代码

image.png

pickle 模块序列化返回的是 byte 类型的数据

二、hashlib 和 base64 加密模块

Python中常用的加密模块主要有 hashlib 和 base64 两个模块

方法 参数 方法描述 使用 返回值
md5() byte md5算法加密 hashlib.md5(b'hallo') Hash对象
sha1() byte sha1算法加密 hashlib.sha1(b'hallo') Hash对象
sha256() byte sha256算法加密 hashlib.sha256(b'hallo') Hash对象
sha512() byte sha512算法加密 hashlib.sha512(b'hallo') Hash对象

数值越高,被破解的概率越低

Hash对象中包含了两个加密方法:

  • hash.digest() :返回加密字符串,作为二进制数据字符串值
  • hash.hexdigest():返回加密字符串,作为十六进制数据字符串值
import hashlib
import time
sign = 'stark'
timestamp = int(time.time())
toke = '{}{}'.format(sign, timestamp)
print(toke)
# 获取hash对象
hash_obj_md5 = hashlib.md5(toke.encode('utf-8'))
print(hash_obj_md5)
print(type(hash_obj_md5))
hash_token = hash_obj_md5.hexdigest()
print("md5加密:{}".format(hash_token))
# 获取hash对象
hash_obj_sh1 = hashlib.sha1(toke.encode('utf-8'))
print(hash_obj_sh1)
print(type(hash_obj_sh1))
hash_token = hash_obj_sh1.hexdigest()
print("sha1加密:{}".format(hash_token))
# 获取hash对象
hash_obj_sh256 = hashlib.sha256(toke.encode('utf-8'))
print(hash_obj_sh256)
print(type(hash_obj_sh256))
hash_token = hash_obj_sh256.hexdigest()
print("sha256加密:{}".format(hash_token))
# 获取hash对象
hash_obj_sh512 = hashlib.sha512(toke.encode('utf-8'))
print(hash_obj_sh512)
print(type(hash_obj_sh512))
hash_token = hash_obj_sh512.hexdigest()
print("sha512加密:{}".format(hash_token))
复制代码

image.png

base64 加密模块常用的方法有:

函数 参数 描述 使用 返回值
encodestring Byte 进行base64加密 base64.encodestring('hi') Byte
decodestring Byte 对base64解密 base64.decodestring(b'aGVsbG8=\n') Byte
encodebytes Byte 进行base64加密 base64.encodebytes(b'hi') Byte
decodebytes Byte 进行base64解密 base64.decodebytes(b'aGVsbG8=\n') Byte
import base64
encode_base64 = base64.encodestring(b'hello')
print(encode_base64)
decode_base64 = base64.decodestring(b'aGVsbG8=\n')
print(decode_base64)
复制代码

image.png

前两个方法从 3.1 开始就过时类,使用后面两个方法代替。

import base64
encode_base64 = base64.encodebytes(b'hello')
print(encode_base64)
decode_base64 = base64.decodebytes(b'aGVsbG8=\n')
print(decode_base64)
复制代码

image.png

base64 模块是可以进行解密的,为了防止通过 base64 加密的字符串被解密,通常会进行加盐或者将密码中的某些字符使用特殊字符替换,之后再进行加密。


相关文章
|
28天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
27天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
15天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
102 80
|
4天前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
26 14
|
14天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
49 2
|
27天前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
46 10
|
27天前
|
人工智能 数据挖掘 开发者
探索Python编程之美:从基础到进阶
本文是一篇深入浅出的Python编程指南,旨在帮助初学者理解Python编程的核心概念,并引导他们逐步掌握更高级的技术。文章不仅涵盖了Python的基础语法,还深入探讨了面向对象编程、函数式编程等高级主题。通过丰富的代码示例和实践项目,读者将能够巩固所学知识,提升编程技能。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考和启示。让我们一起踏上Python编程的美妙旅程吧!
|
2月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
2月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
3月前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。