hashlib加密模块
将明文(人看得懂)数据通过一些手段变成密文数据(人看不懂)
密文数据的表现形式一般都是一串没有规则的字符串
加密算法就是将铭文变成密文的方法,算法的难易程度可以根据产生密文的长短来判断,越长意味着越复杂
涉及到隐私数据的时候 应该考虑使用加密
最为常见的就是对用户的密码加密 防止密码泄露
import hashlib
md5 = hashilib.md5
md5.update(b'hello')
'''如果数据只有数字和字符,可以在前面加b直接转成bytes类型'''
res = md5.hexdigest()
'''在传入数据是,明文一致则密文一致'''
md5 = hashlib.md5()
md5.update(b'hello')
md5.update(b'world')
md5.update(b'jason')
print(md5.hexdigest())
md5.update(b'helloworldjason')
print(md5.hexdigest())
加密补充
所谓的反解密其实就是暴力破解,反复的猜
"""
md5解密内部本质
提前想好很多可能是密码的组合
123 自己加密
321 自己加密
222 自己加密
{'密文1':123,'密文2':321}
然后将要破解的密文与提前想好的进行比对
"""
能够增加破解的难度
import hashlib
md5 = hashlib.md5()
md5.update('你追我'.encode('utf8'))
md5.update(b'123')
print(md5.hexdigest())
干扰项动态变化
可以是用户名的一部分,也可以是当前时间
"""
加密应用场景
1.密码加密如何比对
用户输入的还是明文但是到了程序里面之后会采用相同的加密算法变成密文
之后拿着密文与跟数据库里面的密文比对如果一致就是密码正确不一致就是错误
2.文件内容一致性校验
作为软件的提供者 我们在提供安全软件的同时会对给该软件内容做加密处理得到一个该安全软件独有的密文
用户在下载软件之后也会对内容做相同的加密之后比对两次密文是否一致
如果是表示中途没有被修改 如果不是表示中途被修改过 可能存在病毒
"""
针对大文件一致性校验的优化策略
如果一个文件有10G 那么如果全部读取并加密速度太慢
这个时候可以考虑对文件内容进行切片读取并加密的操作
login模块
'''日志模块就是在程序的各个环境记录 便于后续的查看'''
import logging
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')
import logging
file_handler = logging.FileHandler(filename='x1.log', mode='a', encoding='utf-8', )
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
handlers=[file_handler, ],
level=logging.ERROR
)
logging.error('错了')
购物车项目
项目简介
db目录:该目录下存放用户信息文件
bin目录:该目录下存放项目的启动文件 start.py
core目录:该目录下存放项目的业务逻辑代码src.py
{"name": "zhang", "pwd": "202cb962ac59075b964b07152d234b70", "balance": 15000, "shop_car": {"飞机": [6, 50000], "面包": [4, 10]}}
'''
将用户信息存放进字典 键name对应用户名, 键pwd对应密码,密码使用md5进行加密, 键balance对应账户余额, 键shop_car对应购物车里的商品信息, 商品信息用字典进行存储,键对应的是商品名,值是一个列表,对应的分别是商品个数和价格
'''
执行该文件,即可启动项目
该文件,封装了购物车项目需要用到的主要功能,包括登录功能、注册功能、商店购物功能,购物车结算功能,另外封装了一个装饰器,装饰器的作用为:用户使用购物以及购物车功能前需要进行登录,如未登录则会对用户进行提示,并跳转到登录函数
具体代码
src.py
import os
import json
import hashlib
md5 = hashlib.md5()
dic_flag = {'is_login': None}
def outer(func_name):
def inner(*args, **kwargs):
if dic_flag.get('is_login'):
func_name()
else:
print('请登录')
login()
return inner
def get_info_abs(name):
a = os.path.dirname(os.path.dirname(__file__))
b = os.path.join(a, 'db')
c = os.path.join(b, f"{name}.json")
return c
'''
登录功能:
1.首先进行一个修改全局变量的声明,目的是为了修改项目登录状态的信息,以便于用于判断是否登录
2.接收用户输入的账号及密码,并对密码进行加密
3.获取用户信息文件中的内容,进行登录校验
'''
def login():
global dic_flag
user_name_login = input('请输入用户名:')
user_pwd_login = input('请输入密码:')
md5.update(user_pwd_login.encode('utf8'))
user_pwd_login = md5.hexdigest()
d = get_info_abs(user_name_login)
try:
with open(d, 'r', encoding='utf8') as f1:
userinfo = json.load(f1)
pwd = userinfo['pwd']
if user_pwd_login == pwd:
print('登录成功')
dic_flag['is_login'] = user_name_login
return
else:
print('密码错误')
except FileNotFoundError as e:
print('用户名不存在')
'''
注册功能:
1.接收注册信息,并对接收的密码进行加密
2.进行查重,判断用户是否已经存在
3.不存在,就新建一个json文件存储用户信息,存在就打印信息提示用户 用户名已存在
'''
def register():
user_name_register = input('请输入您要注册的用户名:')
user_pwd_register = input('请输入账户密码:')
md5.update(user_pwd_register.encode('utf8'))
user_pwd_register = md5.hexdigest()
d = get_info_abs(user_name_register)
if os.path.exists(d):
print('用户名已存在')
else:
with open(d, 'w', encoding='utf8') as f:
dic = {"name": user_name_register, "pwd": user_pwd_register, "balance": 15000, "shop_car": {}}
json.dump(dic, f,ensure_ascii=False)
print('注册成功')
'''
商店购物功能:
1.首先是语法糖装饰,目的是使得该功能调用前必须进行登录
2.打印出商品清单,提示并接收用户输入信息
3.使用enumerate枚举出商品信息,并给出对应的序号
4.接收用户的选择
5.根据用户的选择将物品添加到用户信息文件中
'''
@outer
def shop():
item = [['鸡蛋', 1], ['挂面', 5], ['薯片', 6], ['面包', 10], ['公仔', 50], ['飞机', 50000]]
for i,j in enumerate(item):
print(f"{i}{j[0]} {j[1]}元")
while True:
user_choice = input('请输入您想要购买的物品编号(exit退出):')
if user_choice == 'exit':
break
if not user_choice.isdigit():
print('请输入对应的数字编号')
user_choice = int(user_choice)
if user_choice in range(len(item)):
count_buy = input('请输入购买的数量:')
good_price = item[user_choice][1]
count_buy = int(count_buy)
good_name = item[user_choice][0]
d = get_info_abs(dic_flag.get('is_login'))
with open(d, 'r', encoding='utf8') as f1:
userinfo = json.load(f1)
shop_list = userinfo['shop_car']
if good_name in shop_list:
shop_list.get(good_name)[0] += count_buy
else:
shop_list[good_name] = [count_buy,good_price]
userinfo['shop_car'] = shop_list
print(f"您已将{count_buy}个{good_name}加入购物车")
with open(d, 'w', encoding='utf8') as f:
json.dump(userinfo, f,ensure_ascii=False)
'''
购物车功能:
1.给出功能选项
2.接收用户选择
3.根据用户选择,执行相应功能
4.查看购物车,打开用户信息文件,读取出用户信息,遍历购物车字典,根据索引取值已经按key取值,获取出商品信息
5.结算功能,根据获取的购物车字典,根据索引取值已经按key取值,取出商品价格以及购买个数,计算总价,与余额对比,余额充足就付费,并提示用户结算成功,余额不足则提示用户余额不足
'''
@outer
def shop_cort():
while True:
print('1.查看购物车\n2.结算\n3.退出')
user_choice = input('请输入您的选择:')
if user_choice == '1':
d = get_info_abs(dic_flag.get('is_login'))
with open(d, 'r', encoding='utf8') as f1:
userinfo = json.load(f1)
shop_list = userinfo['shop_car']
s = '购物车:\n'
for i in shop_list:
price = shop_list[i][0] * shop_list[i][1]
s = s + i + ':' + str(shop_list[i][0]) + '个 共计:' + str(price) + '元' + '\n'
print(s)
if user_choice == '2':
sum_price = 0
d = get_info_abs(dic_flag.get('is_login'))
with open(d, 'r', encoding='utf8') as f1:
userinfo = json.load(f1)
shop_list = userinfo['shop_car']
balane2 = userinfo['balance']
for i in shop_list:
sum_price += shop_list[i][0] * shop_list[i][1]
if balane2 > sum_price:
userinfo['balance'] = balane2 - sum_price
userinfo['shop_car'] = {}
print(f"您的余额为{userinfo['balance']}")
with open(d, 'w', encoding='utf8') as f:
json.dump(userinfo, f,ensure_ascii=False)
else:
print('余额不足')
if user_choice =='3':
return
start.py
'''
将功能名存进字典,根据用户选择按key取值并执行相应的函数
'''
from core import src
func_dic = {'1':src.login,'2':src.register,'3':src.shop,'4':src.shop_cort}
while True:
while True:
print('1.登录\n2.注册\n3.商店\n4.购物车')
func_choice = input('请输入您的选项:')
func_dic[func_choice]()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人