在Flask应用中,您可以结合前端JavaScript框架和后端Flask来实现登录验证。这里使用jsencrypt库在前端进行密码的加密,然后将加密后的密码发送到后端进行验证。
首先,在前端安装jsencrypt库,可以通过CDN引入或者使用npm安装:
或者使用npm安装:
npm install jsencrypt
接下来,在前端JavaScript代码中创建一个JSEncrypt对象,并使用它来加密用户的密码:
// 假设您有一个公钥,可以从后端获取或硬编码
var publicKey = "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxvZy+mRY\n...\n-----END PUBLIC KEY-----";
var encryptor = new JSEncrypt();
encryptor.setPublicKey(publicKey);
// 用户输入密码
var password = document.getElementById('password').value;
// 加密密码
var encryptedPassword = encryptor.encrypt(password);
// 发送加密后的密码到后端
fetch('/login', {
method: 'POST',
body: JSON.stringify({ encrypted_password: encryptedPassword }),
headers: {
'Content-Type': 'application/json'
}
});
在后端Flask应用中,您需要生成一对密钥,并将公钥发送给前端,私钥用于解密接收到的加密密码。可以使用Python的cryptography库来生成密钥和处理加密:
pip install cryptography
然后,在Python代码中生成密钥对:
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import padding
# 生成密钥对
private_key = serialization.generate_pkey(
serialization.Encoding.PEM,
serialization.PublicFormat.SubjectPublicKeyInfo,
backend=default_backend()
)
public_key = private_key.public_key()
# 将公钥转换为PEM格式字符串
public_pem = public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
).decode('utf-8')
# 将公钥发送给前端
在处理登录请求时,您需要解密接收到的加密密码,并与数据库中存储的哈希值进行比较:
from flask import Flask, request, jsonify
from werkzeug.security import check_password_hash
app = Flask(__name__)
@app.route('/login', methods=['POST'])
def login():
data = request.json
encrypted_password = data['encrypted_password']
# 假设我们有一个数据库连接db
user = db.execute("SELECT password FROM users WHERE username = ?", [username]).fetchone()
if user is None:
return jsonify({'error': 'User not found'}), 404
else:
# 解密接收到的加密密码
decrypted_password = private_key.decrypt(
encrypted_password,
padding.OAEP(
mgf=padding.MGF1(algorithm='SHA1'),
algorithm='AES256',
label=None
)
)
# 验证解密后的密码是否与数据库中存储的哈希值匹配
if check_password_hash(user[0], decrypted_password.decode('utf-8')):
return jsonify({'success': True}), 200
else:
return jsonify({'error': 'Invalid password'}), 401
请注意,在生产环境中,直接将私钥存储在代码中是不安全的。私钥应该安全地存储在服务器上,并且不应该暴露给客户端。此外,为了进一步提升安全性,您应该使用HTTPS来保护客户端和服务器之间的通信。
以上代码只是一个简化的例子,实际应用中您需要考虑更多的安全措施和异常处理。
网站首页 > 技术文章 正文
- 上一篇: 关于前端安全的威胁与对策
- 下一篇: 面试官:前端请求如何避免明文传输?谁沉默了,原来是我
猜你喜欢
- 2025-05-08 前端存储革命:IndexedDB 从入门到实战
- 2025-05-08 交易所安全测试(七)丨用户认证(交易所操作)
- 2025-05-08 Go进阶AES对称 Crypto-JS 加密和Go解密
- 2025-05-08 【开源】强烈推荐,国内首个开源国密前后端分离快速开发平台
- 2025-05-08 终于知道公钥、私钥、对称、非对称加密是什么了
- 2025-05-08 前后端分离之http报文数据加密篇(前后端接口加密传输)
- 2025-05-08 如何设计一套二次验证机制来防止非真实用户在12306刷票?
- 2025-05-08 前端安全-漏洞攻防指南(前端攻击以及防御方法)
- 2024-09-17 如何优雅的实现 Spring Boot 接口参数加密解密?
- 2024-09-17 浅析前端加密后数据包的修改方法
你 发表评论:
欢迎- 05-10如何优化数据库和前端之间的交互?
- 05-10前端代码优化小秘籍(前端优化24条建议)
- 05-10VS Code当中的15个神仙插件,值得收藏
- 05-10如何自己开发一个Google浏览器插件?
- 05-10前端流行框架Vue3教程:14. 组件传递Props效验
- 05-10吃了一年的SU,最好用的插件都在这了
- 05-10前端必看!这款神器让网站界面告别千篇一律
- 05-10程序员请收好:10个非常有用的 Visual Studio Code 插件
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端md5加密 (49)
- 前端路由 (55)
- 前端数组 (65)
- 前端定时器 (47)
- 前端懒加载 (45)
- 前端接口 (46)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle查询数据库 (45)
- oracle约束 (46)
- oracle 中文 (51)
- oracle链接 (47)
- oracle的函数 (57)
- mac oracle (47)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)