总结
哈希加密
-
哈希加密(md5哈希算法中的一种)
- 特点一:哈希算法生成的摘要不可逆.(不能通过密文来获取原文)
- 特点二:只有相同的数据通过相同的算法得到的摘要才是一致的
- 特点三:不管多大的数据产生的摘要长度一致
- 特点二三可以用来验证数据的完整性,大的数据也可
-
生成hash摘要
-
通过算法创建hash对象:hashlib.算法名()
算法名:md5,shaXXXhash = hashlib.md5()
-
字符串转二进制:
方法一
bytes(字符串, encoding=“utf-8”)
方法二
字符串.encode() -
二进制转字符串
方法一
str(二进制, encoding=“utf-8”)
方法二
二进制.encode() -
添加数据
hash对象.update(数据) 加密数据必须为为二进制数据,类型是byteshash.update("sda1353".encode())
-
获取摘要
result = hash.hexdigest() print(result)
-
数据持久化
-
程序中保存的数据默认都是保存在运行内存中的,在程序运行结束的时候都会被释放
如果希望这次运行程序产生的数据在下一次运行的时候还能用,就需要将数据保存到硬盘中
将数据保存到硬盘的过程就是数据持久化的过程
硬盘保存的基本单元是文件,只要将数据保存到文件中就可以将数据保存到硬盘中
程序中数据持久化常用文件类型:数据库文件(.db, .sqlite等), plist文件, json文件
二进制文件(图片,视频,音频,exe可执行文件) -
文件操作 操作文件的内容
文件操作基本流程: 打开文件 -> 操作文件(读,写) -> 关闭文件-
打开文件
open(file, mode='r', *,encoding=None) 以指定方式打开指定文件,返回一个文件对象 file 需要打开的文件在计算机中的位置信息(文件路径),字符串 绝对路径:文件在计算机里面的全路径 相对路径:(.表示当前目录,就是当前代码文件所在的文件夹) (..表示当前目录的上层目录) (...表示当前目录的上层目录的上层目录)
-
open(r"\QFLearn\时间日期格式化符号.PNG")
mode 文件打开方式,决定打开文件后后续能对该文件进行的操作以及操作数据的类型
第一组:“r”, “w”, “a” 控制操作数据的类型
第二组:“t”, “b” 控制操作数据类型
第一组必须选一个,第二组可以不选,不选默认是"t"
“r” 只读
“w” 只写,会清空原文件内容
“a” 只写,会保留原文件内容 “t” 读操作返回的数据和写操作写入的数据是字符串(str)
“b” 读操作返回的数据和写操作写入的数据是二进制(bytes)
注意:二进制文件打开的时候必须带b
encoding 文本文件的编码方式(需要保证写入数据采用什么方式进行编码,读的时候就需要对应的方式解码)
一般采用utf-8,但很多windows文本默认编码是gdk
注意:只有以t的方式打开文本文件的时候才需要考虑给encoding赋值 -
关闭文件 文件对象.close()
f.close()
-
操作结束后自动关闭
with open(路径, mode=‘r’, *,encoding=None) as 文件对象: -
操作
- 读操作
文件对象.read() 从读写位置开始,读到文件结束.读写位置默认在文件开头
文件对象.seek(0) 将读写位置移动到文件开头
文件对象.readline() 从读写位置开始,读到一行结束,只能读文本文件
文件对象.readline() 从读写位置开始,读到一行结束就是一个元素,放到一个列表里 - 写操作
文件对象.write()
- 读操作
-
作业
登录注册
import hashlib
def log_in(): # 登录
name = input("请输入用户名:")
s_password = input("请输入密码:")
f = open("./date.py", "r", encoding="utf-8")
f.seek(0)
name_date = f.readline()
while name_date:
if name in eval(name_date):
hansh = hashlib.md5()
hansh.update(s_password.encode())
password = hansh.hexdigest()
if password == eval(name_date)[name]:
print("登录成功")
break
else:
print("登录失败,密码错误")
break
else:
name_date = f.readline()
if name_date:
pass
else:
print("学生用户不存在")
def sign_in(): # 注册
name = input("请输入用户名:")
s_password = input("请输入密码:")
add_stud = 1 # 保存判断值
f = open("./date.py", "r", encoding="utf-8")
f.seek(0)
name_date = f.readline()
while name_date:
if name in eval(name_date):
add_stud = 0
print("学生用户存在")
break
else:
name_date = f.readline()
if add_stud:
hansh = hashlib.md5()
hansh.update(s_password.encode())
password = hansh.hexdigest()
n_p = {name: password}
f = open("./date.py", "a", encoding="utf-8")
f.write(f"{n_p}\n")
print("添加成功")
f.close()
def choise():
while True:
print("1.登录\n2.注册\n3.退出\n")
n = input("请选择:")
if int(n) == 1: # 登录
log_in()
print("=================")
continue
elif int(n) == 2: # 注册
sign_in()
print("=================")
continue
elif int(n) == 3: # 退出
break
choise()