专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

Flask采用jsencrypt来实现登录验证数据加密解密

ins518 2024-09-17 22:05:03 技术文章 24 ℃ 0 评论

在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来保护客户端和服务器之间的通信。

以上代码只是一个简化的例子,实际应用中您需要考虑更多的安全措施和异常处理。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表