En aquest tema, aprendrem com gestionar les contrasenyes de manera segura en una aplicació Flask. El hashing de contrasenyes és una tècnica essencial per protegir les dades dels usuaris. En lloc d'emmagatzemar les contrasenyes en text pla, les convertim en una representació hash que és molt més difícil de desxifrar.
Conceptes Clau
- Hashing: És el procés de convertir una entrada (com una contrasenya) en una cadena fixa de caràcters, que sembla aleatòria.
- Salting: És l'addició d'una cadena aleatòria a la contrasenya abans de fer el hashing per evitar atacs de taules arc de Sant Martí.
- Biblioteca
werkzeug.security
: Flask utilitza aquesta biblioteca per proporcionar funcions de hashing segures.
Instal·lació de les Dependències
Abans de començar, assegura't de tenir instal·lada la biblioteca Flask
i werkzeug
. Pots instal·lar-les utilitzant pip:
Creació d'un Exemple Pràctic
- Configuració del Projecte
Crea un nou directori per al teu projecte i dins d'aquest directori, crea un fitxer anomenat app.py
.
- Importació de les Biblioteques Necessàries
from flask import Flask, request, jsonify from werkzeug.security import generate_password_hash, check_password_hash app = Flask(__name__)
- Funcions per al Hashing de Contrasenyes
Generació de Hash
Utilitzarem la funció generate_password_hash
per crear un hash de la contrasenya.
Verificació de Contrasenya
Utilitzarem la funció check_password_hash
per verificar si una contrasenya coincideix amb el seu hash.
def verify_password(stored_password_hash, provided_password): return check_password_hash(stored_password_hash, provided_password)
- Creació de Rutes per a la Gestió de Contrasenyes
Ruta per a Registrar un Usuari
@app.route('/register', methods=['POST']) def register(): data = request.get_json() username = data['username'] password = data['password'] # Generar el hash de la contrasenya password_hash = hash_password(password) # Emmagatzemar l'usuari i el hash de la contrasenya (aquí només ho imprimim) print(f"Usuari: {username}, Hash de la Contrasenya: {password_hash}") return jsonify({"message": "Usuari registrat correctament!"}), 201
Ruta per a Iniciar Sessió
@app.route('/login', methods=['POST']) def login(): data = request.get_json() username = data['username'] password = data['password'] # Recuperar el hash de la contrasenya emmagatzemada (aquí només ho simularem) stored_password_hash = "hash_emmagatzemat" # Això hauria de venir de la base de dades # Verificar la contrasenya if verify_password(stored_password_hash, password): return jsonify({"message": "Inici de sessió correcte!"}), 200 else: return jsonify({"message": "Contrasenya incorrecta!"}), 401
- Executar l'Aplicació
Finalment, executa l'aplicació Flask:
Exercicis Pràctics
Exercici 1: Implementar la Base de Dades
Modifica l'exemple anterior per emmagatzemar els usuaris i els seus hash de contrasenya en una base de dades SQLite.
Exercici 2: Millorar la Seguretat
Investiga i implementa una política de contrasenyes segures (per exemple, longitud mínima, combinació de caràcters, etc.).
Solucions als Exercicis
Solució a l'Exercici 1
from flask_sqlalchemy import SQLAlchemy app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db' db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) password_hash = db.Column(db.String(120), nullable=False) @app.route('/register', methods=['POST']) def register(): data = request.get_json() username = data['username'] password = data['password'] password_hash = hash_password(password) new_user = User(username=username, password_hash=password_hash) db.session.add(new_user) db.session.commit() return jsonify({"message": "Usuari registrat correctament!"}), 201 @app.route('/login', methods=['POST']) def login(): data = request.get_json() username = data['username'] password = data['password'] user = User.query.filter_by(username=username).first() if user and verify_password(user.password_hash, password): return jsonify({"message": "Inici de sessió correcte!"}), 200 else: return jsonify({"message": "Contrasenya incorrecta!"}), 401
Solució a l'Exercici 2
import re def is_password_strong(password): if len(password) < 8: return False if not re.search("[a-z]", password): return False if not re.search("[A-Z]", password): return False if not re.search("[0-9]", password): return False if not re.search("[@#$%^&+=]", password): return False return True @app.route('/register', methods=['POST']) def register(): data = request.get_json() username = data['username'] password = data['password'] if not is_password_strong(password): return jsonify({"message": "Contrasenya no compleix els requisits de seguretat!"}), 400 password_hash = hash_password(password) new_user = User(username=username, password_hash=password_hash) db.session.add(new_user) db.session.commit() return jsonify({"message": "Usuari registrat correctament!"}), 201
Conclusió
En aquesta secció, hem après com gestionar les contrasenyes de manera segura utilitzant hashing i salting. Hem creat rutes per registrar i iniciar sessió d'usuaris, i hem implementat una base de dades per emmagatzemar els usuaris. També hem vist com millorar la seguretat de les contrasenyes amb una política de contrasenyes segures. Amb aquests coneixements, estàs preparat per gestionar la seguretat de les contrasenyes en les teves aplicacions Flask.
Curs de Desenvolupament Web amb Flask
Mòdul 1: Introducció a Flask
- Què és Flask?
- Configuració del Teu Entorn de Desenvolupament
- Creant la Teva Primera Aplicació Flask
- Entenent l'Estructura d'una Aplicació Flask
Mòdul 2: Conceptes Bàsics de Flask
- Enrutament i Mapeig d'URL
- Gestió de Mètodes HTTP
- Renderització de Plantilles amb Jinja2
- Treballant amb Fitxers Estàtics
Mòdul 3: Formularis i Entrada d'Usuari
Mòdul 4: Integració de Bases de Dades
- Introducció a Flask-SQLAlchemy
- Definició de Models
- Realització d'Operacions CRUD
- Migracions de Bases de Dades amb Flask-Migrate
Mòdul 5: Autenticació d'Usuaris
- Registre d'Usuaris
- Inici i Tancament de Sessió d'Usuaris
- Hashing de Contrasenyes
- Gestió de Sessions d'Usuaris
Mòdul 6: Conceptes Avançats de Flask
- Blueprints per a Aplicacions Grans
- Gestió d'Errors
- Pàgines d'Error Personalitzades
- Registre i Depuració
Mòdul 7: APIs RESTful amb Flask
- Introducció a les APIs RESTful
- Creació de Punts Finals RESTful
- Gestió de Dades JSON
- Autenticació per a APIs
Mòdul 8: Desplegament i Producció
- Configuració de Flask per a Producció
- Desplegament a Heroku
- Desplegament a AWS
- Monitorització i Optimització del Rendiment
Mòdul 9: Proves i Millors Pràctiques
- Proves Unitàries amb Flask
- Proves d'Integració
- Cobertura de Proves
- Millors Pràctiques per al Desenvolupament amb Flask