hash 密码校验

import bcryptdef hash_password(password):# 生成一个新的saltsalt = bcrypt.gensalt()print(salt)# 使用生成的salt哈希密码hashed_password = bcrypt.hashpw(password.encode('utf-8'), salt)print(hashed_password)# 将salt和哈希密码合并以便存储stored_password = f"{salt.decode('utf-8')}${hashed_password.decode('utf-8')}"print(stored_password)return stored_passworddef verify_password(input_password, stored_password):# 从合并的字符串中提取存储的saltsalt = stored_password.split('$$')[0].encode('utf-8')# 使用存储的salt哈希输入密码hashed_input_password = bcrypt.hashpw(input_password.encode('utf-8'), salt)# 直接比较哈希后的密码,而不再次哈希输入密码return f"{salt.decode('utf-8')}${hashed_input_password.decode('utf-8')}" == stored_passwordx = hash_password("xyz")
if verify_password("xyz", x):print("Pass")
else:print("Fail")

为了做个登录界面,校验一下用户名密码,了解了一下这个库
,简单做客一个用户注册和登录的界面:
源代码:

from flask import request, Flask, render_template
import bcrypt
import ossavePath = os.path.join(os.getcwd(), "userInfo")# 实例化
app = Flask(__name__)
# 这里是主页面,即第一步显示的网页,有一个对话框和搜索按钮
@app.route('/')
def mainweb():return render_template("first.html", result="欢迎使用NAS页面")# 设定第二步的跳转网页,methods 设定请求类型,这里可以指定一种类型,就不用判断了。主要是类型不同,获取结果的方式不同
@app.route('/login', methods=['POST'])
def login():# post 类型抓取对话框内的内容username = request.form.get("username", "")passwd = request.form.get("password", "")if username == passwd == "":return render_template('login.html', result="欢迎")if verifyLogin(username, passwd):return render_template('main.html', result="......")else:return render_template('login.html', result="用户名或密码错误")@app.route('/signIn', methods=['POST'])
def signIn():# post 类型抓取对话框内的内容username = request.form.get("username", "")passwd = request.form.get("password", "")if username == passwd == "":return render_template('signIn.html', result="请输入正确的用户名和密码")if saveLogin(username, passwd):return render_template('login.html', result="注册成功,请登录")else:return render_template('signIn.html', result="用户名重复,请更换用户名重新注册")def verifyLogin(user, passwd):# 读取存储的用户信息saveFile = os.path.join(savePath, user)if os.path.isfile(saveFile):with open(saveFile, 'r', encoding="UTF-8") as f:savepasswd = f.read()# 从合并的字符串中提取存储的saltsalt = savepasswd.split('||')[0].encode('utf-8')# 使用存储的salt哈希输入密码hash_passwd = bcrypt.hashpw(passwd.encode('utf-8'), salt)password = f"{salt.decode('utf-8')}||{hash_passwd.decode('utf-8')}"return password == savepasswdelse:return Falsedef saveLogin(user, passwd):# 生成一个新的saltsalt = bcrypt.gensalt()# 使用生成的salt哈希密码hashed_password = bcrypt.hashpw(passwd.encode('utf-8'), salt)# 将salt和哈希密码合并以便存储stored_password = f"{salt.decode('utf-8')}||{hashed_password.decode('utf-8')}"# 保存用户信息saveFile = os.path.join(savePath, user)if os.path.isfile(saveFile):return Falseelse:if os.path.isdir(savePath):passelse:os.makedirs(savePath)with open(saveFile, 'w', encoding="UTF-8") as f:f.write(stored_password)return Trueif __name__ == '__main__':app.run(host="0.0.0.0", port=5000)

主要需要调用到三个HTML模板,三个模版的背景图片还没放,也就是没有优化界面,暂时先做功能,后续优化
first.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Login Page</title><style>body {font-family: Arial, sans-serif;background-color: #f4f4f4;margin: 0;padding: 0;display: flex;align-items: center;justify-content: center;height: 100vh;}.login-container {background-color: #fff;padding: 20px;border-radius: 8px;box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);}.form-group {margin-bottom: 15px;}.form-group label {display: block;margin-bottom: 8px;font-weight: bold;}.form-group input {width: 100%;padding: 8px;box-sizing: border-box;border: 1px solid #ccc;border-radius: 4px;}.form-group button {padding: 10px;background-color: #007bff;color: #fff;border: none;border-radius: 4px;cursor: pointer;}/* 设置动图的样式和位置 */  .animated-image {  /* 宽度和高度可以根据需要调整 */  width: 200px;  height: 200px;  /* 位置属性可以控制动图的位置 */  position: absolute; /* 或者使用其他位置属性,如 relative、fixed 等 */  top: 50px; /* 调整 top、right、bottom 和 left 属性来定位动图 */  left: 100px;  }  </style>
</head>
<body><!-- 使用 img 标签嵌入动图 --><img src="{{ url_for('static', filename='huaji.gif') }}" alt="欢迎" class="animated-image"><div class="login-container"><h1>{{ result }}<h1><form action="/login" method="post"><div class="form-group"><button type="submit">进入登录页面</button></div></form><form action="/signIn" method="post"><div class="form-group"><button type="submit">进入注册页面</button></div></form></div></body>
</html>

login.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Login Page</title><style>body {font-family: Arial, sans-serif;background-color: #f4f4f4;margin: 0;padding: 0;display: flex;align-items: center;justify-content: center;height: 100vh;}.login-container {background-color: #fff;padding: 20px;border-radius: 8px;box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);}.form-group {margin-bottom: 15px;}.form-group label {display: block;margin-bottom: 8px;font-weight: bold;}.form-group input {width: 100%;padding: 8px;box-sizing: border-box;border: 1px solid #ccc;border-radius: 4px;}.form-group button {padding: 10px;background-color: #007bff;color: #fff;border: none;border-radius: 4px;cursor: pointer;}/* 设置动图的样式和位置 */  .animated-image {  /* 宽度和高度可以根据需要调整 */  width: 200px;  height: 200px;  /* 位置属性可以控制动图的位置 */  position: absolute; /* 或者使用其他位置属性,如 relative、fixed 等 */  top: 50px; /* 调整 top、right、bottom 和 left 属性来定位动图 */  left: 100px;  }  </style>
</head>
<body><!-- 使用 img 标签嵌入动图 --><img src="{{ url_for('static', filename='huaji.gif') }}" alt="欢迎" class="animated-image"><div class="login-container"><h1>{{ result }}<h1><h2>log in</h2><form action="/login" method="post"><div class="form-group"><label for="username">Username:</label><input type="text" id="username" name="username" required></div><div class="form-group"><label for="password">Password:</label><input type="password" id="password" name="password" required></div><div class="form-group"><button type="submit">log in</button></div><form></div></body>
</html>

signIn.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Sign In Page</title><style>body {font-family: Arial, sans-serif;background-color: #f4f4f4;margin: 0;padding: 0;display: flex;align-items: center;justify-content: center;height: 100vh;}.signin-container {background-color: #fff;padding: 20px;border-radius: 8px;box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);}.form-group {margin-bottom: 15px;}.form-group label {display: block;margin-bottom: 8px;font-weight: bold;}.form-group input {width: 100%;padding: 8px;box-sizing: border-box;border: 1px solid #ccc;border-radius: 4px;}.form-group button {padding: 10px;background-color: #007bff;color: #fff;border: none;border-radius: 4px;cursor: pointer;}/* 设置动图的样式和位置 */  .animated-image {  /* 宽度和高度可以根据需要调整 */  width: 200px;  height: 200px;  /* 位置属性可以控制动图的位置 */  position: absolute; /* 或者使用其他位置属性,如 relative、fixed 等 */  top: 50px; /* 调整 top、right、bottom 和 left 属性来定位动图 */  left: 100px;  }  </style>
</head>
<body><!-- 使用 img 标签嵌入动图 --><img src="{{ url_for('static', filename='huaji.gif') }}" alt="欢迎" class="animated-image"><div class="signin-container"><h1>{{ result }}<h1><h2>sign in</h2><form action="/signIn" method="post"><div class="form-group"><label for="username">Username:</label><input type="text" id="username" name="username" required></div><div class="form-group"><label for="password">Password:</label><input type="password" id="password" name="password" required></div><div class="form-group"><button type="submit">sign in</button></div></form></div></body>
</html>

其实就是套用一个模板,稍微修改一些参数,变成不同的模版
此脚本运行后,会先调用first.html 生成一个选择页面, 登录|注册
选择后跳转到相应页面
登录页面,会验证用户名密码是否有在本地存储,且正确无误,如果错误会显示提示。
登录上去以后,应该跳转主页面…我现在主页面暂时没有放功能…待完善…
注册页面,会验证注册的用户名是否存在,存在则显示错误提示,不存在则创建文件存储密码到本地,随后跳转到登录界面

慢慢学,慢慢看…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/238060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Moonbeam生态项目分析 — — 游戏项目The Great Escape

概览 The Great Escape是一款2D的Play and Earn平台游戏&#xff0c;曾入选MoonbeamMoonbeam Accelerator&#xff0c;并经此培训孵化后于2023年7月正式发表。 玩家必须在给定时间内在充满敌人和陷阱的关卡中收集尽可能多的水果。游戏结束后&#xff0c;游戏主要根据收集的水…

【蓝桥杯备考资料】Python基础语法

【蓝桥杯备考资料】Python基础语法 基础语法一、数据类型1.Number1.1整型1.2浮点型1.3复数类型1.4常用数学函数 2.String2.1字符串访问和运算2.2字符串函数 3.List(重点)3.1列表的创建3.2列表函数 4.Tuple5.Dictionary5.1字典的访问5.2添加&#xff0c;修改&#xff0c;复制&am…

Pytorch-RealSR超分模型

1.前言 RealSR 是一种基于学习的单图像超分辨率&#xff08;SISR&#xff09;模型&#xff0c;专门针对真实世界的图像。它由腾讯 AI 实验室于 2020 年提出。 RealSR 的核心创新是提出了一种新的退化模型&#xff0c;该模型能够更好地模拟真实世界的退化过程。该模型考虑了真实…

202312实战面试

1、 事件循环和变量提升。 for(var i 0; i < 5; i){setTimeout(() >{console.log(i)}, 1000) } console.log(i) // 先输出6、间隔一秒后输出六次6&#xff1b;// 考察宏微任务、EventLoop 之类 Promise.resolve().then(() > {console.log(0);return Promise.resolve(…

【已解决】修改了网站的class样式name值,会影响SEO,搜索引擎抓取网站及排名吗?

问题&#xff1a; 修改了网站的class样式name值&#xff0c;会影响搜索引擎抓取网站及排名吗&#xff1f; 解答&#xff1a; 如果你仅仅修改了网站class样式的名称&#xff0c;而没有改变网站的结构和内容&#xff0c;那么搜索引擎通常不会因此而影响它对网站的抓取和排名。但…

中国自动驾驶行业:迈向无限可能

中国自动驾驶行业正在经历蓬勃发展&#xff0c;取得了令人瞩目的成果。这一行业在技术创新、政策支持和市场需求等方面展现出巨大潜力。本文将从技术创新、产业生态和前景发展等角度&#xff0c;探讨中国自动驾驶行业的现状和未来前景。 中国自动驾驶行业正处于一个令人瞩目的快…

C++基础语法总结

C使用 C的源文件扩展名是&#xff1a;cppC程序的入口是main函数C完全兼容c语言的语法 1、cin、cout C中常使用cin、cout进行控制台的输入和输出 #include <iostream> using namespace std;int main() {cout << "hello world !!!" << endl;retu…

德人合科技 | 设计公司文件加密系统——天锐绿盾自动智能透明加密防泄密系统

设计公司文件加密系统——天锐绿盾自动智能透明加密防泄密系统 PC端访问地址&#xff1a; www.drhchina.com 一、背景介绍 设计公司通常涉及到大量的创意作品、设计方案、客户资料等重要文件&#xff0c;这些文件往往包含公司的核心价值和商业机密。因此&#xff0c;如何确保…

动态代理和静态代理

代理模式&#xff08;Proxy Pattern&#xff09;&#xff1a;通过创建代理对象来控制对另一个对象的访问&#xff0c;通常用于实现横切关注点&#xff08;cross-cutting concerns&#xff09;&#xff0c;例如日志记录、系统安全性检查等。常见的代理模式就是动态代理和静态代理…

Linux磁盘空间不足扩展

先在虚拟机Vmware上扩展磁盘空间 后将fdisk 进行分区之后&#xff0c;在/dev/中找不到新分区文件 3.创建物理卷pv时发现找不到/dev/sda3分区&#xff0c;通过ls查看确认在/dev/中没有找到新分区文件 4.解决方法 执行&#xff1a;partprobe 再查看/dev中是否可以看到新分区文件…

QT计算时间差 秒 毫秒 (另附c++版本)

QT计算时间差&#xff0c;两次时间的间隔 项目计算码流需要用到计算时间差 QT版本 利用secsTo函数 QDateTime startTime QDateTime::currentDateTime();Sleep(5000);QDateTime endTime QDateTime::currentDateTime();qint64 intervalTime startTime.secsTo(endTime); //求…

云轴科技ZStack 英特尔联合成立云系统解决方案创新中心

近日&#xff0c;云轴科技ZStack 与英特尔联合成立云系统解决方案创新中心&#xff0c;并完成揭牌仪式。双方将基于多年合作基础进一步加快研发下一代创新技术和解决方案&#xff0c;为客户和合作伙伴提供更高效、安全的云基础设施解决方案。 左三:云轴科技ZStack 联合创始人兼…

量化交易学习笔记:XGBoost 在量化选股中的应用

一、引言 本篇文章通过借鉴传统机器学习算法——XGBoost——对相同的量价因子进行实验&#xff0c;方便与深度学习模型进行对比实践。 二、算法介绍 XGBoost 是在 Gradient Boosting&#xff08;梯度提升&#xff09;框架下实现的机器学习算法&#xff0c;全称为“极限梯度提…

FPGA模块——以太网(1)MDIO读写

FPGA模块——以太网MDIO读写 MDIO接口介绍MDIO接口代码&#xff08;1&#xff09;MDIO接口驱动代码&#xff08;2&#xff09;使用MDIO驱动的代码 MDIO接口介绍 MDIO是串行管理接口。MAC 和 PHY 芯片有一个配置接口&#xff0c;即 MDIO 接口&#xff0c;可以配置 PHY 芯片的工…

树的重心(dfs深度搜索)

树的重心 原题链接&#xff1a;846. 树的重心 - AcWing题库 邻接表存储树图 模板代码 void add(int a, int b){e[id] b,ne[id] h[a], h[a] id; }dfs 搜索树 模板代码 void dfs(int u){f[u] true;for(int i h[u]; i!-1; i ne[i]){int j e[i];if(!f[j])dfs(j);} }整体…

理解AI思维链:AI领域的核心概念及其意义

理解AI思维链&#xff1a;AI领域的核心概念及其意义 引言AI思维链的定义AI思维链的重要性实际应用案例分析面临的挑战与未来展望结语 引言 在这个日益由数据驱动的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为科技领域的一颗耀眼的明星&#xff0c;其影响力遍…

java UDP编程

UDP协议是一个不安全、不连续的&#xff0c;把数据发送出去之后就结束了&#xff0c;根本不管对方有没有接收到。 快递员&#xff1a;DatagramSocket 包裹&#xff1a;DatagramPacket 原理就是将数据以及对方的信息都放到包裹里面&#xff0c;然后让快递员发送给对应的人。…

(八)STM32 USART —— 串口通讯

目录 1. 串口通讯协议简介 1.1 物理层 1.1.1 电平标准 1&#xff09;TTL 电平 2&#xff09;RS-232 电平 3&#xff09;RS-485 电平 4&#xff09;CAN 总线电平 1.1.2 USB 和 串口 的区分 1.1.3 RS-232 信号线 1.2 协议层 1&#xff09;波特率 2&#xff09;通讯…

负载均衡:一致性哈希解决了哪些问题?

在业务开发中&#xff0c;缓存服务和其他数据服务一样&#xff0c;需要满足高可用性&#xff0c;而高可用最常用的手段就是集群扩展。 缓存的集群高可用 目前 Redis 流行的集群方案有 官方 Cluster 方案、twemproxy 代理方案、哨兵模式、Codis 等方案&#xff0c;关于这几种方…

Java 自定义泛型

1、接口的泛型 例如List<数据类型>&#xff0c;在创建接口的时候可以通过传不同的类型&#xff0c;进行使用。 如果需要对一些类型进行一些相同的类似于增删改查的操作&#xff0c;那么可以用泛型来简化&#xff0c;只需要将需要操作的类型传入即可。 需要注意的是泛型…