首页 > 其他分享 >序列模块pickle模块hashlib模块

序列模块pickle模块hashlib模块

时间:2023-09-22 21:12:24浏览次数:36  
标签:username hashlib password random json 模块 print 序列化 pickle

序列模块pickle模块hashlib模块

序列化模块

什么是序列化?什么是序列?
	序列就是字符串
   序列化是把其他数据类型转为json字符串的过程

什么是反序列化?
	把json字符串转为其他数据类型的过程就是反序列化
    
"""json字符串 json对象"""

在Python中把其他数据类型转为json需要使用json模块

import json # 内置的

import json

# 1. 把字典类型转为json格式的数据
"""
json模块中与四个方法
json.dumps---->序列化用的   json.loads------》反序列化

json.dump------》序列化,它可以直接写入文件      json.load-----------》它能够读取文件,然后自动反序列化
"""
d = {"username":"kevin", 'age':18} # {"username": "kevin", "age": 18}
# 序列化
print(type(d)) # dict
print(json.dumps(d), type(json.dumps(d)))  # <class 'str'> {"username": "kevin", "age": 18}
## json格式的数据特点:字典里面的都变成了双引号

"""通过网络传输的数据一定是二进制"""
# 反序列化:java给你发送了数据------------》
res = b'{"username": "kevin", "age": 18}'

# 把二进制数据转为Python中得字典
print(res.decode('utf-8'), type(res.decode('utf-8'))) # {"username": "kevin", "age": 18}

s1 = res.decode('utf-8') # 把字符串格式的json转为抛Python中得字典

print(json.loads(s1), type(json.loads(s1)))
d1 = json.loads(s1)
print(d1['username'])

"""字节类型------》字符串-----------》字典"""




### 1. 把字典格式的数据写入到文件中
# d = {'username':'jerry', 'age':18}
### 写入文件必须是二进制或者字符串
# with open('a.txt', 'w', encoding='utf-8') as f:
#     f.write(json.dumps(d))

###2. 从文件中读取数据并且要是字典格式
# with open('a.txt', 'r', encoding='utf-8') as f1:
#     res=eval(f1.read()) # {'username': 'jerry', 'age': 18}
#     print(res, type(res))


### 3. 非常方便的写入文件
# with open('a.txt', 'w', encoding='utf-8') as f:
#     # 1. 先把数据序列化,2. 把数据write进去
#     json.dump(d, f)

### 4. 从文件读取json格式的字符串
# with open('a.txt', 'r', encoding='utf-8') as f1:
#     # 1. 先反序列化,然后读出来
#     res=json.load(f1) # {'username': 'jerry', 'age': 18}
#     print(res, type(res))


"""补充扩展"""
d = {'username':'jerry你好啊', 'age':18}
"""有时候可以查看源码来学习一些新东西,以后遇到函数不知道怎么用,就要追代码. """
print(json.dumps(d,ensure_ascii=False)) # {"username": "jerry\u4f60\u597d\u554a", "age": 18}


### 难道说Python中得所有数据类型都可以序列化成json? 不是
json.JSONEncoder

 +-------------------+---------------+
    | Python            | JSON          |
    +===================+===============+
    | dict              | object        |
    +-------------------+---------------+
    | list, tuple       | array         |
    +-------------------+---------------+
    | str               | string        |
    +-------------------+---------------+
    | int, float        | number        |
    +-------------------+---------------+
    | True              | true          |
    +-------------------+---------------+
    | False             | false         |
    +-------------------+---------------+
    | None              | null          |
    +-------------------+---------------+
    

pickle模块

 """pickle的使用方式跟json一模一样,json中有四个方法,pickle也是这四个方法"""

能够被序列化的数据类型不一样,json能够序列化的数据类型是有限的
有:dict list, tuple str  int, float True False  None

pickle能够序列化的类型:所有数据类型
"""它不好的地方在于,被pickle处理之后的数据只能够在Python中使用"""

# 另外,pickle序列化之后的结果是二进制的

# d = {"a":1, 'b':2}
l = [1 ,2 ,3 ,4]
import pickle
# print(pickle.dumps(d)) # b'\x80\x04\x95\x11\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x01a\x94K\x01\x8c\x01b\x94K\x02u.'
print(pickle.dumps(l)) # b'\x80\x04\x95\r\x00\x00\x00\x00\x00\x00\x00]\x94(K\x01K\x02K\x03K\x04e.'
res = pickle.dumps(l)
print(pickle.loads(res))


# with open('a.txt', 'wb') as f:
#     pickle.dump(l, f)

with open('a.txt', 'rb') as f:
    print(pickle.load(f))

hashlib模块

什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,'把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。'

# 1. 先指定使用的加密算法:MD5 sha系列 sha1 sha128 sha256等
m = hashlib.md5() # 加密数据的时候,使用的是md5算法

# 2. 指定需要加密的数据
# m.update(b'123456')
m.update(b'1234567894321424234234234324234234234234234324')  # 323fda2da07ce11869e8c3737f36b96b
"""不管你需要加密的数据有多长,那么,得到的加密串结构都是固定长度的,前提是使用同一种算法"""
# 3. 怎么取出加密之后的结果呢
print(m.hexdigest()) # e10adc3949ba59abbe56e057f20f883e





明文				密文
123456			e10adc3949ba59abbe56e057f20f883e
1234567			e10adc3949ba59abbe56e057f20f883e
1234567			e10adc3949ba59abbe56e057f20f883e
1234567			e10adc3949ba59abbe56e057f20f883e
1234567			e10adc3949ba59abbe56e057f20f883e
1234567			e10adc3949ba59abbe56e057f20f883e
1234567			e10adc3949ba59abbe56e057f20f883e
1234567			e10adc3949ba59abbe56e057f20f883e
1234567			e10adc3949ba59abbe56e057f20f883e
1234567			e10adc3949ba59abbe56e057f20f883e



"""撞库"""


#### 加盐:加密的时候在多一个干扰项
## 注册功能

# username = input('username:>>>').strip()
# password = input('password:>>>').strip()
#
# s_passowrd = password + 'qaz'
# m = hashlib.md5()
# m.update(s_passowrd.encode('utf-8'))
# new_pwd = m.hexdigest()[0:16]
# data = '%s|%s' % (username, new_pwd)
#
# with open('userinfo.txt', 'w', encoding='utf-8') as f:
#     f.write(data)


### 登录

# username = input('username:>>>').strip()
# password = input('password:>>>').strip()
#
# s_passowrd = password + 'qaz'
# m = hashlib.md5()
# m.update(s_passowrd.encode('utf-8'))
# new_pwd = m.hexdigest()[0:16]
#
# with open('userinfo.txt', 'r', encoding='utf-8') as f:
#     real_username, real_password = f.read().split('|')
#
# if username == real_username and real_password == new_pwd:
#     print('登录成功')
# else:
#     print('用户名或者密码错误')

import random
def get_code(n):
    code = ''
    for i in range(n):
        random_int = str(random.randint(0, 9))
        random_upper = chr(random.randint(65, 90))
        random_lower = chr(random.randint(97, 122))
        temp = random.choice([random_int, random_upper, random_lower])
        code += temp

    return code


## 玩法三:终极玩法
# username = input('username:>>>').strip()
# password = input('password:>>>').strip()
# 
# random_str = get_code(4) # qazw
# s_passowrd = password + random_str
# m = hashlib.md5()
# m.update(s_passowrd.encode('utf-8'))
# new_pwd = m.hexdigest()[0:16]
# data = '%s|%s|%s\n' % (username, new_pwd, random_str)
# 
# with open('userinfo.txt', 'a', encoding='utf-8') as f:
#     f.write(data)


username = input('username:>>>').strip()
password = input('password:>>>').strip()

with open('userinfo.txt', 'r', encoding='utf-8') as f:
    real_username, real_password, random_str = f.read().split('|')

s_passowrd = password + random_str
m = hashlib.md5()
m.update(s_passowrd.encode('utf-8'))
new_pwd = m.hexdigest()[0:16]

if username == real_username and new_pwd == real_password:
    print('密码正确')
else:
    print('用户名和密码不正确')

标签:username,hashlib,password,random,json,模块,print,序列化,pickle
From: https://www.cnblogs.com/zhangfanshixiaobai/p/17723366.html

相关文章

  • 3. 设计数据采集模块——基于FPGA的串口发送数据实验
    1.设计数据采集模块基于Send_en的可控设计。使得使用外部信号Data_done来启动数据发送成为可能。放弃使用Tx_done控制的做法。因此把控制Send_en的逻辑放到内部去完成。这样设计更加符合应用。1.1设计要求把Send_en的控制部分放到模块内部去,使用Send_Go作为输入信号可能......
  • 你的LED模块FCC证书ICES证书LM79报告
    LED模块EN62031报告LED模块IEC62031报告LED模块GB24819报告LED模块CE证书LED模块EMC证书LED模块LVD证书LED模块CCC证书LED灯3C证书LED模块FCC证书LED模块ICES证书LED模块SAA证书LED模块RCM证书LED模块LM79报告LED模块LM80报告LED模块Erp能效报告LED模块TUV证书LED......
  • freeswitch 新模块开发
    1、在Debian系统上成功编译并通过源码安装freeswitch2、在src/mod/application/目录下新建mod_helloworld目录。2、在src/mod/application/mod_helloworld/目录下创建mod_helloworld.c文件3、在文件中写入如下内容:#include<switch.h>SWITCH_MODULE_LOAD_FUNCTION......
  • Python functools模块:提升函数式编程的5个常用函数
    Python的functools模块是标准库中的一个强大工具,提供了一系列函数,用于优化和增强函数式编程的能力。这些函数可以帮助我们处理函数、操作装饰器、缓存结果等。介绍functools模块中的五个常用函数,包括 partial、wraps、lru_cache、reduce和compose,并提供相关的代码示例,帮助更好......
  • ESP8266串口WiFi模块的四大创新型应用领域分析
    ESP8266串口WiFi模块顾名思义,这是一款基于ESP8266方案的串口WiFi模块,可将用户的物理设备连接到WiFi无线网络上,进行互联网或局域网通信,实现联网功能。ESP8266串口WiFi模块是一种适用性强、应用范围广泛的WiFi模块。 ESP8266串口WiFi模块根据当前物联网市场发展趋势,ESP8266串口WiFi......
  • MQ - 03 基础篇_网络模块
    @[toc]导图概述对消息队列来说,网络模块是核心组件之一,网络模块的性能很大程度上决定了消息传输的能力和整体性能。如果你是Java技术栈的开发人员,讲到网络模块的开发,大概率第一反应就是Netty。Netty作为Java网络编程中最出名的类库,几乎主宰了Java的网络编程。那消息队列网络......
  • import引用自定义包、模块sys.path.append() ---转
    https://blog.csdn.net/Frank_LJiang/article/details/122656604import引用自定义包、模块)sys.path.append(问题sys.path.append()os.path.dirname(__file__)问题当引用不同文件下的自定义包时,容易出现以下问题ModuleNotFoundError:Nomodulenamed'ge'由于importxxx时,默认情......
  • git submodule多模块开发
     开发中遇见了这样一个问题,ABC三个项目都要使用到同一个模块的一些功能,并且这个模块的功能根据ABC三个项目场景需要一些代码逻辑改动(ABC可以理解为三个使用了不同base工具包的项目,或者相同base工具包但是版本不同等),这个时候git的submodule可能会帮你解决这个问题。......
  • random模块os模块
    random模块os模块random模块importrandom#print(random.random())#o-1的小数0.654381741577838#print(random.uniform(1,3))#大于1小于32.1890586235082763#print(random.randint(1,10))#31-10的整数随机#print(random.randrange(0,30,2))#8偶数随机#print(random.r......
  • 常用的内置模块
    时间模块这个模块我们就比较熟悉了,之前学的时候调用过内部的几个功能三种时间表现形式1.时间戳(timestamp)返回秒数。通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。2.结构化时间(struct_time)主要是给......