一.加密模块 (hashilb)
# 1.什么是加密模块
将明文(人看得懂)数据通过一些手段变成密文数据(人看不懂)
密文数据的表现形式一般都是一串没有规则的字符串
# 2.什么时候使用加密
涉及到隐私数据的时候 应该考虑使用加密
最为常见的就是对用户的密码加密 防止密码泄露
1.1 基本使用
import hashlib
# 1.md5算法
md5 = hashlib.md5()
# 2.md5.update(b'hello') # 只能接收bytes类型
"""如果字符串中是纯数字和英文 那么直接在前面加b转成bytes类型"""
# 3.获取加密之后的密文数据
res = md5.hexdigest()
print(res) # 5d41402abc4b2a76b9719d911017c592
'在传入数据的时候 只要内容一致 那么算法的结果肯定一致'
md5 = hashlib.md5()
md5.update(b'hello')
md5.update(b'world')
md5.update(b'jason')
print(md5.hexdigest())
# 结果: 8faebe82e744992e51c86845cac3e1b7
md5.update(b'helloworldjason')
print(md5.hexdigest())
# 结果: 8faebe82e744992e51c86845cac3e1b7
二.加密补充
'也就是说加密过后的结果基本是无法破解的,唯一破解方法也就是猜'
# 1.加盐处理(增加破解难度)
import hashlib
md5 = hashlib.md5()
md5.update('加盐处理'.encode('utf8'))
md5.update(b'123')
print(md5.hexdigest())
"""动态加盐处理 (动态干扰变化也能是时间等动态部分)"""
# 2.加密应用场景
1.密码加密如何比对
用户输入的还是明文但是到了程序里面之后会采用相同的加密算法变成密文
之后拿着密文与跟数据库里面的密文比对如果一致就是密码正确不一致就是错误
2.文件内容一致性校验
作为软件的提供者 我们在提供安全软件的同时会对给该软件内容做加密处理得到一个该安全软件独有的密文
用户在下载软件之后也会对内容做相同的加密之后比对两次密文是否一致
如果是表示中途没有被修改 如果不是表示中途被修改过 可能存在病毒
"""如果一个文件有10G 那么如果全部读取并加密速度太慢
这个时候可以考虑对文件内容进行切片读取并加密的操作"""
三.日志模块 (logging)
import logging
'日志等级为(5)个等级:默认只有达到warning警告级别及以上才会记录日志'
# 1.logging.debug('debug message') # 10
# 2.logging.info('info message') # 20
# 3.logging.warning('warning message') # 30
# 4.logging.error('error message') # 40
# 5.logging.critical('critical message') # 50
3.1小例
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('瞌睡了嘛')
四.作业
点击查看代码
作业:
import json
import os
import hashlib
# 需要调用这连个函数 所以提前写上
# 获取当前执行路径
current_path = os.path.dirname(__file__)
# 在当前文件夹内添加db文件夹 拼接
data_path = os.path.join(current_path, 'db')
# 在当前文件里判断这个db也就是(data_path)文件是否存在
if not os.path.exists(data_path): # 判断db文件不存在
# 不存在则 添加文件夹(也就是db文件)
os.mkdir(data_path)
# 定义一个用户是否登陆的全局变量
is_login = {'username': None}
# 登陆认证装饰器
def login_auth(func_name):
def inner(*args, **kwargs):
if is_login.get('username'):
res = func_name(*args, **kwargs)
return res
else:
print('你还没有登陆')
login()
return inner
# 1.首先写出框架总体的框架
def register():
print('用户注册功能')
# 2.注册首先让用户输入账号密码
username = input('请输入你的姓名>>>:').strip()
password = input('请输入你的密码>>>:').strip()
# 2.1正常情况下需要再次确定密码
confirm_pwd = input('请再次输入你的密码>>>:').strip()
# 2.2进行密码加密功能
md5 = hashlib.md5()
md5.update(password.encode('ascii')) # 123
password = md5.hexdigest() # 123123
md5 = hashlib.md5()
md5.update(confirm_pwd.encode('ascii')) # 123
confirm_pwd = md5.hexdigest()
# 2.3判断你注册的两个密码会否一致
if not password == confirm_pwd:
print('非常抱歉两次密码输入的不一致')
return
# 3.拼接db文件夹 下方添加 username文件夹json 因为有db就创建新的文件夹
file_path = os.path.join(data_path, f'{username}.json')
# 4.然后效验用户名文件夹是否存在
if os.path.isfile(file_path):
print('用户名已经存在')
return
# 5.添加用户字典方便操作
user_dict = {'username': username, 'password': password, 'balance': 2000000, 'shop_car': {}}
# 6.序列化到文件中
with open(file_path, 'w', encoding='utf8') as f:
json.dump(user_dict, f, ensure_ascii=False)
print(f'恭喜{username}注册成功')
def login():
print('用户登陆功能')
# 1.用户登陆功能
username = input('请输入您的账号>>>:').strip()
password = input('请输入你的密码>>>:').strip()
# 1.1密码加密
md5 = hashlib.md5()
md5.update(password.encode('ascii'))
password = md5.hexdigest()
# 2.拼接用户路径
file_path = os.path.join(data_path, f'{username}.json')
# 3.判断这路径是否存在
if not os.path.isfile(file_path):
print('你输入的账户不存在')
return
# 4.用户存在.获取用户信息去比对
with open(file_path, 'r', encoding='utf8') as f:
user_path = json.load(f)
# 5.判断密码是否正确
if password == user_path.get('password'):
print('登陆成功')
# 修改全局字典
is_login['username'] = username
else:
print('密码错误')
@login_auth
def add_shopping_cart():
# 1.定义购物车数据(代码直接写死 也可以通过专门的商品文件便于后期维护更新)
good_list = [
['挂壁面', 3],
['印度飞饼', 22],
['极品木瓜', 666],
['土耳其土豆', 999],
['伊拉克拌面', 1000],
['董卓戏张飞公仔', 2000],
['仿真玩偶', 10000]
]
# 11.创建一个临时的商品存储数据字典
empty = {}
# 2.商品需循环信息给用户选择
while True:
# 3.循环打印商品 让用户选择 给商品添加编号
for i, j in enumerate(good_list):
print("商品编号:%s | 商品名称:%s | 商品单价:%s " % (i, j[0], j[1]))
# 用户选择商品编号
choice = input('请输入你要购买的商品编号,如果退出请按q').strip()
# 12.退出按q 就该用户购物车数据保存
if choice == 'q':
file_path = os.path.join(data_path, '%s.json' % is_login.get('username'))
with open(file_path, 'r', encoding='utf8') as f:
user_dict = json.load(f)
# 13.修改用户购物车数据(不能直接替换 应该考虑购物车内是否已经有了数据)
real_shop_car = user_dict.get('shop_car')
# 14.循环取到购物车保存数据
for good_name in empty:
# 15.和修改后的购物车数据进行比对
if good_name in real_shop_car:
# 16.修改后的数据信息索引0 + 之前购买的数据索引0 = 新的商品数量
real_shop_car[good_name][0] += empty[good_name][0]
else:
# 17.商品名称不变
real_shop_car[good_name] = empty[good_name]
user_dict['shop_car'] = real_shop_car
# 从新写入文件
with open(file_path, 'w', encoding='utf8') as f:
json.dump(user_dict, f, ensure_ascii=False)
print('商品数据添加购物车成功')
break
# 5.判断商品编号是否是纯数字
if not choice.isdigit():
print('商品必须是纯数字')
# 6.将用户输入字符串编号转换为整型方便后续所引取值
choice = int(choice)
# 7.校验数字范围是否在商品列表的索引范围内
if not choice in range(len(good_list)):
print('抱歉你输入的商品不在我们范围内')
continue
# 8.获取用户购买的商品数据
target_good_list = good_list[choice]
target_good_name = target_good_list[0]
target_good_price = target_good_list[1]
# 9.获取用户想要购买的数量
target_num = input('请输入你要购买的数量>>>:').strip()
# 判断是否输入的是否为纯数字
if target_num.isdigit():
# 转换为整数
target_num = int(target_num)
# 10.还有可能购买其他商品 判断商品数量和购物车里数量
if target_good_name not in empty:
# 10.购物车数量有这个商品名字相当于键,添加了新的值也就是商品数量和商品价格
# 也就是说键在则修改 键不在则添加新的键值对
empty[target_good_name] = [target_num, target_good_price]
else:
# 10.2键在 则修改值 也就是增量赋值添加数量
empty[target_good_name][0] += target_num
else:
print('必须输入纯数字')
@login_auth
def settlement():
# 1.先获取用户购物车数据
file_path = os.path.join(data_path, '%s.json'% is_login.get('username'))
# 2.获取用户购物车
with open(file_path, 'r', encoding='utf8') as f:
user_dict = json.load(f)
shop_car = user_dict.get('shop_car')
# 3.定义一个总价
total_money = 0
# 4.计算商品总价钱
for good_num, good_price in shop_car.values():
total_money += good_num * good_price
# 5.判断是否可以买得起
balance = user_dict.get('balance')
if balance > total_money:
rest_money = balance - total_money
user_dict['balance'] = rest_money
# 5.扣钱成功.清空购物车
user_dict['shop_car'] = {}
# 6.保存
with open(file_path,'w',encoding='utf8') as f:
json.dump(user_dict, f, ensure_ascii=False)
print(f'结算成功 今日消费{total_money} 余额{rest_money} 欢迎下次光临!!!')
else:
print('钱不够 你个穷逼!!!')
# 2.将功能编写到一个可供选择的字典中方便调用
user_data_dict = {'1': register, '2': login, '3': add_shopping_cart, '4': settlement}
# 3.写出供用户选择的编号
while True:
print("""
1.用户注册功能
2.用户登陆功能
3.添加购物车功能
4.结算购物车功能
""")
# 用户输入编号
choice = input('请输入你需要的编号>>>:').strip()
# 判断用户和字典内编号是否一致 因为字典暴露出来的只有键 然后成员判断
if choice in user_data_dict:
# 直接拿键所对应的函数名
func_name = user_data_dict.get(choice)
# 可以直接调用函数字典
func_name()
else:
print('抱歉您输入的编号不存在')