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.
Ingeniero en Informática, me encanta crear cosas o arreglarlas y darles una nueva vida. Escritor y poeta. Más de 20 APPs publicadas y un libro en Amazon.