Practica individual para comparar un login inseguro con hash SHA256 fijo contra un login seguro con PBKDF2-SHA256 y salt automatico.
El proyecto esta organizado con arquitectura hexagonal para separar reglas de negocio, casos de uso y tecnologia externa.
- Python 3.11 o superior.
- No requiere paquetes externos.
python run.pyDespues abre:
http://127.0.0.1:8000
La base de datos SQLite se crea automaticamente en:
C:\Users\picud\Repos\login-auth-demo\data\auth_demo.db
cd C:\Users\picud\Repos\login-auth-demo
python -m unittest discover -s testssrc/
domain/
entities.py Entidades User, PasswordHash y LoginResult
ports.py Puertos PasswordHasher y UserRepository
exceptions.py Errores de dominio
application/
use_cases.py Casos de uso: registro, login, CRUD y demo
infrastructure/
database/
sqlite_user_repository.py
security/
sha256_password_hasher.py
pbkdf2_password_hasher.py
web/
app.py
static/styles.css
SHA256PasswordHasher: generasha256(password)sin salt. Si dos usuarios tienen la misma contrasena, el hash queda igual.PBKDF2PasswordHasher: genera un salt aleatorio por usuario y deriva la clave con PBKDF2-SHA256. Si dos usuarios tienen la misma contrasena, el salt y el hash cambian.
- Abre la pagina
Arquitecturay toma captura de las capas. - Entra a
Registroy crea un usuario manual. - Entra a
CRUD usuariosy prueba crear, editar y eliminar usuarios. - Entra a
Comparacion BDy pulsaCargar demo. - Usa los usuarios
demo_anaydemo_luis; ambos tienen contrasena123456. - Observa que
SHA256 sin saltse repite para ambos usuarios. - Observa que
Salt seguroyHash PBKDF2son diferentes. - Prueba
Login insegurocondemo_anay123456. - Prueba
Login segurocondemo_luisy123456.
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE,
full_name TEXT NOT NULL DEFAULT '',
insecure_password_hash TEXT NOT NULL,
secure_password_hash TEXT NOT NULL,
secure_salt TEXT NOT NULL,
secure_iterations INTEGER NOT NULL,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
);