Un sistema completo de autenticación desarrollado con Angular 18 (frontend) y .NET 8 (backend), con características de seguridad robustas como verificación de email, recuperación de contraseñas, y protección contra ataques.
- Descripción
- Tecnologías Utilizadas
- Requisitos Previos
- Instalación y Configuración
- Estructura del Proyecto
- Ejecución del Proyecto
- Características
- Seguridad
- Sistema de Validación de Contraseñas
- Implementación de Hashing de Contraseñas
AuthSystem es un proyecto integral que proporciona una solución completa de autenticación y gestión de usuarios con funciones avanzadas de seguridad. El sistema implementa prácticas recomendadas de seguridad como hashing de contraseñas con sal embebida, protección contra ataques de fuerza bruta, verificación de email, y autenticación basada en tokens JWT.
- Angular 18
- TypeScript
- TailwindCSS
- SweetAlert2
- JWT Decode
- .NET 8 API
- C#
- JWT Authentication
- MySQL
- PBKDF2 con SHA512 para hashing de contraseñas
Antes de comenzar, asegúrate de tener instalado:
- Node.js (v18 o superior) y npm (v10 o superior)
- .NET 8 SDK
- MySQL (v8 o superior)
- Git
- Visual Studio, Visual Studio Code o un IDE compatible
git clone https://github.com/yourusername/AuthSystem.git
cd AuthSystem- Restaurar paquetes NuGet:
cd backend
dotnet restore- Configuración de la Base de Datos:
- Crea una base de datos MySQL
- Actualiza la cadena de conexión en
appsettings.json:
"ConnectionStrings": {
"default": "Server=localhost;Database=authsystem;Uid=tu_usuario;Pwd=tu_contraseña;"
}- Configuración de JWT:
- Actualiza la sección JWTSettings en
appsettings.json:
- Actualiza la sección JWTSettings en
"JWTSettings": {
"securityKey": "tu_clave_secreta_larga_y_segura",
"validIssuer": "AuthSystem",
"validAudience": "AuthSystemUsers",
"expiryInMinutes": "60"
}- Configuración de Email:
- Actualiza la sección EmailSettings en
appsettings.json:
- Actualiza la sección EmailSettings en
"EmailSettings": {
"SenderEmail": "tu_email@ejemplo.com",
"SmtpPassword": "tu_contraseña",
"SmtpServer": "smtp.ejemplo.com",
"SmtpPort": 587,
"DisplayName": "AuthSystem"
}- Ejecuta las migraciones de la base de datos:
- Los scripts SQL se encuentran en la carpeta
/database(si están disponibles)
- Los scripts SQL se encuentran en la carpeta
- Instalar dependencias:
cd ../frontend
npm install- Configuración del entorno:
- Verifica y ajusta la URL de la API en los archivos de entorno:
src/app/environments/environment.tssrc/app/environments/environment.development.ts
AuthSystem/
├── backend/ # Proyecto .NET
│ ├── Controllers/ # Controladores API
│ ├── DTOs/ # Data Transfer Objects
│ ├── Repositories/ # Acceso a datos
│ ├── Services/ # Servicios de negocio
│ │ ├── Auth/ # Servicios de autenticación
│ │ │ ├── PasswordHasher.cs # Implementación de hashing de contraseñas
│ ├── appsettings.json # Configuración
│
├── frontend/ # Proyecto Angular
│ ├── src/
│ │ ├── app/
│ │ │ ├── core/ # Servicios compartidos
│ │ │ ├── pages/ # Páginas de la aplicación
│ │ │ ├── environments/ # Configuración de entorno
cd backend
dotnet runEl servidor API se iniciará en https://localhost:7135.
cd frontend
ng serveLa aplicación Angular se ejecutará en http://localhost:4200.
- Registro de usuarios con verificación de email
- Inicio de sesión por email o nombre de usuario
- Protección contra ataques de fuerza bruta
- Recuperación de contraseñas con tokens seguros
- Autenticación basada en JWT con renovación de tokens
- Validación de formularios en tiempo real
- Diseño responsive con TailwindCSS
- Internacionalización (Español por defecto)
- Hashing de contraseñas avanzado con PBKDF2 + SHA512
- Sal embebida en el hash para mayor seguridad y simplicidad
- Protección contra ataques de timing usando comparaciones de tiempo constante
- Verificación de email obligatoria
- Protección contra múltiples intentos fallidos de inicio de sesión (bloqueo de cuenta)
- Tokens JWT con tiempo de expiración
- HTTPS para comunicaciones seguras
El sistema implementa un robusto mecanismo de validación de contraseñas en el frontend que garantiza que los usuarios creen credenciales seguras:
- Longitud mínima: 12 caracteres (recomendado 14+)
- Complejidad obligatoria:
- Al menos una letra mayúscula
- Al menos una letra minúscula
- Al menos un número
- Al menos un símbolo especial (@, $, !, %, *, ?, &, etc.)
- Visualización en tiempo real mientras el usuario escribe
- Escala de cinco niveles:
- Muy débil (rojo)
- Débil (naranja)
- Media (amarillo)
- Fuerte (azul)
- Muy fuerte (verde)
- Barra de progreso con código de colores
El indicador de fortaleza evalúa las contraseñas basándose en:
- Longitud: puntos adicionales para contraseñas de 12+, 14+, 16+ y 20+ caracteres
- Variedad de caracteres: uso de mayúsculas, minúsculas, números y símbolos
- Unicidad de caracteres: al menos 70% de caracteres únicos
- Puntuación máxima: 9 puntos (para calificar como "muy fuerte")
- Mensajes de error específicos y claros para cada requisito no cumplido
- Validación instantánea mientras el usuario escribe
- Interfaz intuitiva con feedback visual
Esta implementación sigue las mejores prácticas de seguridad modernas y ayuda a los usuarios a crear contraseñas que sean tanto seguras como memorables.
El sistema utiliza un método seguro y moderno para el almacenamiento y verificación de contraseñas:
public sealed class PasswordHasher : IPasswordHasher
{
private const int SaltSize = 16; // Tamaño de la sal en bytes
private const int HashSize = 32; // Tamaño del hash en bytes
private const int Iterations = 100000; // Número de iteraciones para PBKDF2
private static readonly HashAlgorithmName Algorithm = HashAlgorithmName.SHA512;
public string Hash(string password)
{
// Generación de sal segura usando RandomNumberGenerator
byte[] salt = RandomNumberGenerator.GetBytes(SaltSize);
// Derivación de clave usando PBKDF2 con SHA512
byte[] hash = Rfc2898DeriveBytes.Pbkdf2(password, salt, Iterations, Algorithm, HashSize);
// Combinación de hash y sal en un solo string (hash-salt)
return $"{Convert.ToHexString(hash)}-{Convert.ToHexString(salt)}";
}
public bool Verify(string password, string passwordHash)
{
// Separación del hash y la sal
string[] parts = passwordHash.Split('-');
byte[] hash = Convert.FromHexString(parts[0]);
byte[] salt = Convert.FromHexString(parts[1]);
// Cálculo del hash con la contraseña proporcionada
byte[] inputHash = Rfc2898DeriveBytes.Pbkdf2(password, salt, Iterations, Algorithm, HashSize);
// Comparación en tiempo constante para prevenir ataques de timing
return CryptographicOperations.FixedTimeEquals(hash, inputHash);
}
}- PBKDF2 con SHA512: Algoritmo criptográficamente seguro para derivación de claves
- 100,000 iteraciones: Mayor resistencia contra ataques de fuerza bruta
- Sal aleatoria de 16 bytes: Generada usando RandomNumberGenerator para máxima seguridad
- Hash de 32 bytes: Longitud suficiente para resistir colisiones
- Formato
{hash}-{sal}: Almacenamiento eficiente de ambos valores en un solo campo - Comparación de tiempo constante: Previene ataques de timing utilizando
CryptographicOperations.FixedTimeEquals - Sin necesidad de campo adicional: La sal se almacena junto con el hash, simplificando la estructura de la base de datos
La implementación simplifica el esquema de la base de datos al eliminar la necesidad de una columna separada para la sal:
CREATE TABLE users (
/* Otros campos */
password_hash VARCHAR(255) NOT NULL,
/* No se necesita una columna password_salt */
/* Otros campos */
);Este enfoque de hashing es superior a las implementaciones tradicionales ya que:
- Simplifica el modelo de datos
- Reduce la posibilidad de errores en la gestión de la sal
- Facilita la migración y el respaldo de datos
- Proporciona seguridad de nivel empresarial contra diversos ataques
Este proyecto está bajo la Licencia MIT - ver el archivo LICENSE para detalles.
Para preguntas o sugerencias, por favor contacta a sebasverac331@gmail.com.
- Node.js (v18 o superior) y npm (v10 o superior)
- .NET 8 SDK
- MySQL (v8 o superior)
- Git
- Visual Studio, Visual Studio Code o un IDE compatible
git clone https://github.com/yourusername/AuthSystem.git
cd AuthSystem- Restaurar paquetes NuGet:
cd backend
dotnet restore- Configuración de la Base de Datos:
- Crea una base de datos MySQL
- Actualiza la cadena de conexión en
appsettings.json:
"ConnectionStrings": {
"default": "Server=localhost;Database=authsystem;Uid=tu_usuario;Pwd=tu_contraseña;"
}- Configuración de JWT:
- Actualiza la sección JWTSettings en
appsettings.json:
- Actualiza la sección JWTSettings en
"JWTSettings": {
"securityKey": "tu_clave_secreta_larga_y_segura",
"validIssuer": "AuthSystem",
"validAudience": "AuthSystemUsers",
"expiryInMinutes": "60"
}- Configuración de Email:
- Actualiza la sección EmailSettings en
appsettings.json:
- Actualiza la sección EmailSettings en
"EmailSettings": {
"SenderEmail": "tu_email@ejemplo.com",
"SmtpPassword": "tu_contraseña",
"SmtpServer": "smtp.ejemplo.com",
"SmtpPort": 587,
"DisplayName": "AuthSystem"
}- Ejecuta las migraciones de la base de datos:
- Los scripts SQL se encuentran en la carpeta
/database(si están disponibles)
- Los scripts SQL se encuentran en la carpeta
- Instalar dependencias:
cd ../frontend
npm install- Configuración del entorno:
- Verifica y ajusta la URL de la API en los archivos de entorno:
src/app/environments/environment.tssrc/app/environments/environment.development.ts
AuthSystem/
├── backend/ # Proyecto .NET
│ ├── Controllers/ # Controladores API
│ ├── DTOs/ # Data Transfer Objects
│ ├── Repositories/ # Acceso a datos
│ ├── Services/ # Servicios de negocio
│ ├── appsettings.json # Configuración
│
├── frontend/ # Proyecto Angular
│ ├── src/
│ │ ├── app/
│ │ │ ├── core/ # Servicios compartidos
│ │ │ ├── pages/ # Páginas de la aplicación
│ │ │ ├── environments/ # Configuración de entorno
cd backend
dotnet runEl servidor API se iniciará en https://localhost:7135.
cd frontend
ng serveLa aplicación Angular se ejecutará en http://localhost:4200.
- Registro de usuarios con verificación de email
- Inicio de sesión por email o nombre de usuario
- Protección contra ataques de fuerza bruta
- Recuperación de contraseñas con tokens seguros
- Autenticación basada en JWT con renovación de tokens
- Validación de formularios en tiempo real
- Diseño responsive con TailwindCSS
- Internacionalización (Español por defecto)
- Contraseñas almacenadas con hash + salt usando Identity
- Verificación de email obligatoria
- Protección contra múltiples intentos fallidos de inicio de sesión
- Tokens JWT con tiempo de expiración
- HTTPS para comunicaciones seguras
Este proyecto está bajo la Licencia MIT - ver el archivo LICENSE para detalles.
Para preguntas o sugerencias, por favor contacta a sebasverac331@gmail.com.