Cómo Encriptar Datos en una Tabla de Base de Datos MySQL con FastAPI y SQLAlchemy

Tiempo de lectura: 2 minutos

En este tutorial, aprenderás cómo encriptar datos sensibles en una tabla de una base de datos MySQL utilizando FastAPI y SQLAlchemy. La encriptación es fundamental para proteger la confidencialidad de los datos almacenados en una base de datos y garantizar su seguridad. En este ejemplo, utilizaremos SQLAlchemy para modelar la base de datos y la función Fernet de la biblioteca cryptography para encriptar y descifrar datos.

Pasos para Encriptar Datos en una Tabla MySQL con FastAPI y SQLAlchemy:

Paso 1: Configurar el entorno y crear la base de datos

Primero, asegúrate de que FastAPI y SQLAlchemy estén instalados en tu entorno de desarrollo. Luego, crea una base de datos MySQL y configura la conexión en tu aplicación FastAPI.

from fastapi import FastAPI
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# Configura la conexión a la base de datos MySQL
DATABASE_URL = "mysql+mysqlconnector://usuario:contrasena@localhost/nombre_de_base_de_datos"
engine = create_engine(DATABASE_URL)

# Crea una instancia de la aplicación FastAPI
app = FastAPI()

# Define una clase de modelo para la tabla de usuarios
Base = declarative_base()

class Usuario(Base):
    __tablename__ = "usuarios"
    id = Column(Integer, primary_key=True, index=True)
    nombre = Column(String)
    contrasena = Column(String)  # La contraseña se almacenará en texto plano antes de encriptarla

Paso 2: Encriptar y almacenar datos en la base de datos

Utilizaremos la función Fernet de la biblioteca cryptography para encriptar la contraseña antes de almacenarla en la base de datos. Asegúrate de reemplazar ‘clave_secreta’ con una clave secreta generada de manera segura.

from sqlalchemy.orm import Session
from cryptography.fernet import Fernet

# Genera una clave secreta para encriptar los datos
clave_secreta = Fernet.generate_key()
fernet = Fernet(clave_secreta)

# Endpoint para crear un nuevo usuario con contraseña encriptada
@app.post("/crear_usuario/")
async def crear_usuario(usuario: Usuario):
    usuario.contrasena = fernet.encrypt(usuario.contrasena.encode())
    db = Session(engine)
    db.add(usuario)
    db.commit()
    db.close()
    return {"mensaje": "Usuario creado con éxito"}

Paso 3: Descifrar la contraseña cuando sea necesario

Para recuperar la contraseña descifrada cuando sea necesario, puedes utilizar la clave secreta para descifrarla.

# Endpoint para obtener un usuario y descifrar la contraseña
@app.get("/obtener_usuario/{usuario_id}")
async def obtener_usuario(usuario_id: int):
    db = Session(engine)
    usuario = db.query(Usuario).filter(Usuario.id == usuario_id).first()
    if usuario:
        contrasena_descifrada = fernet.decrypt(usuario.contrasena.encode()).decode()
        db.close()
        return {"nombre": usuario.nombre, "contrasena": contrasena_descifrada}
    db.close()
    return {"mensaje": "Usuario no encontrado"}

Conclusión:
Encriptar datos en una tabla de una base de datos MySQL es una práctica importante para proteger la seguridad y la confidencialidad de los datos sensibles. En este tutorial, hemos aprendido cómo configurar una base de datos MySQL en FastAPI y utilizar SQLAlchemy para interactuar con ella. También hemos utilizado la función Fernet de la biblioteca cryptography para encriptar y descifrar contraseñas.

Recuerda mantener segura la clave secreta utilizada para la encriptación, ya que es esencial para proteger los datos. Además, implementa medidas de seguridad adicionales para garantizar la integridad y la confidencialidad de tus datos en la base de datos.

Deja un comentario