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

  1. Hashing: És el procés de convertir una entrada (com una contrasenya) en una cadena fixa de caràcters, que sembla aleatòria.
  2. 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í.
  3. 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:

pip install Flask
pip install Werkzeug

Creació d'un Exemple Pràctic

  1. Configuració del Projecte

Crea un nou directori per al teu projecte i dins d'aquest directori, crea un fitxer anomenat app.py.

  1. 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__)

  1. Funcions per al Hashing de Contrasenyes

Generació de Hash

Utilitzarem la funció generate_password_hash per crear un hash de la contrasenya.

def hash_password(password):
    return generate_password_hash(password)

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)

  1. 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

  1. Executar l'Aplicació

Finalment, executa l'aplicació Flask:

if __name__ == '__main__':
    app.run(debug=True)

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

Mòdul 2: Conceptes Bàsics de Flask

Mòdul 3: Formularis i Entrada d'Usuari

Mòdul 4: Integració de Bases de Dades

Mòdul 5: Autenticació d'Usuaris

Mòdul 6: Conceptes Avançats de Flask

Mòdul 7: APIs RESTful amb Flask

Mòdul 8: Desplegament i Producció

Mòdul 9: Proves i Millors Pràctiques

Mòdul 10: Extensions i Ecosistema de Flask

© Copyright 2024. Tots els drets reservats