Hashing de Contraseñas en Bases de Datos con Node.js
Clase 7 de 22 • Curso de NestJS: Autenticación con Passport y JWT
Resumen
¿Cómo se protege una contraseña mediante hashing?
El hashing de contraseñas es esencial para mantener la seguridad de los datos en una base de datos. Este proceso transforma una contraseña en una secuencia irreconocible mediante algoritmos de cifrado. Esto no solo protege la información si alguien accede a la base de datos, sino que también garantiza que ni siquiera los administradores puedan ver las contraseñas reales de los usuarios.
¿Por qué es importante el hashing?
- Protección de datos: Impide que atacantes obtengan contraseñas directamente de la base de datos.
- Privacidad del usuario: Asegura que ni el administrador ni otras personas vean las contraseñas.
- Seguridad adicional: Evita que contraseñas débiles, como '123456', sean fácilmente explotadas.
¿Cómo implementar hashing en NodeJS?
Para implementar correctamente el hashing de contraseñas en un proyecto en NodeJS, es necesario seguir ciertos pasos y utilizar las herramientas adecuadas.
Paso 1: Instalación de la librería de hashing
Utiliza una librería de confianza específicamente diseñada para NodeJS. Asegúrate de instalar también el tipado, ya que muchas librerías no lo incluyen por defecto.
npm install bcrypt
npm install @types/bcrypt --save-dev
Paso 2: Implementación del hashing en el servicio
Una vez instalada la librería, debes integrarla en el servicio donde se gestionan las credenciales del usuario.
import * as bcrypt from 'bcrypt';
async function createUser({ email, password }) {
// Obtener y generar un hash de la contraseña
const hashedPassword = await bcrypt.hash(password, 10);
// Guardar el usuario con la contraseña hasheada
saveUserToDatabase({ email, password: hashedPassword });
}
El proceso de hashing es asíncrono y por eso es importante manejarlo dentro de una función async
. Normalmente se utilizan 10 saltos (rondas) para incrementar la complejidad del hashing.
Paso 3: Excluir contraseñas del retorno de consultas
Es importante que las contraseñas no se devuelvan en las respuestas de las API. Usa serialización y otras técnicas para asegurarte de que las contraseñas estén escondidas.
class UserTransformer {
// Decorador para excluir el campo 'password'
@Exclude()
password: string;
}
¿Cómo verificar un usuario con autenticación?
Además del hashing, es vital contar con un mecanismo de búsqueda eficiente para autenticar a los usuarios. Crear un método para buscar por email es crucial.
async function findByEmail(email: string) {
return userRepo.findOne({ email });
}
Preparación del servicio para la autentificación
Una vez ajustados los métodos, es vital habilitar el servicio para ser consumido desde otros módulos.
@Module({
exports: [UserService],
})
export class UserModule {}
¿Cómo manejar el hashing en MongoDB?
El proceso de hashing en MongoDB se mantiene similar al de otros sistemas de gestión de bases de datos. La implementación varía dependiendo del ORM o la herramienta que estés utilizando, pero el concepto sigue siendo el mismo: proteger la información de usuario mediante métodos de cifrado robustos.
Siempre mantén tus conocimientos al día y recuerda que la seguridad es un aspecto crucial del desarrollo de software. Con dotarte de estas herramientas y prácticas, brindas a tus usuarios la protección que merecen.