Volver a la página principal
jueves 18 julio 2024
248

Cómo encriptar contraseñas en JavaScript

Introducción a la Encriptación de Contraseñas

Encriptar contraseñas implica transformar la contraseña en un formato que no puede ser fácilmente revertido a su forma original. Esto se logra mediante técnicas de hashing y salting:

  • Hashing: Es el proceso de convertir una entrada (en este caso, una contraseña) en una cadena de caracteres de longitud fija.
  • Salting: Consiste en agregar una cadena aleatoria a la contraseña antes de encriptarla para asegurar que contraseñas iguales no generen el mismo hash.

Uso de bcrypt en JavaScript

bcrypt es una de las librerías más populares para encriptar contraseñas. Proporciona una forma segura y efectiva de hash de contraseñas.

Instalación de bcrypt

Para usar bcrypt en tu proyecto, primero necesitas instalarlo. Si estás trabajando con Node.js, puedes instalarlo usando npm o yarn:

npm install bcrypt

o

yarn add bcrypt

Encriptar una Contraseña

Aquí hay un ejemplo de cómo encriptar una contraseña usando bcrypt:

const bcrypt = require('bcrypt');

const saltRounds = 10; // Número de rondas de sal
const plainPassword = 'miContraseñaSegura';

bcrypt.hash(plainPassword, saltRounds, function(err, hash) {
  if (err) {
    console.error('Error encriptando la contraseña:', err);
  } else {
    console.log('Contraseña encriptada:', hash);
  }
});

En este ejemplo:

  • saltRounds indica cuántas veces se aplica el algoritmo de hash. Más rondas implican mayor seguridad pero más tiempo de procesamiento.
  • plainPassword es la contraseña que quieres encriptar.
  • bcrypt.hash genera el hash de la contraseña.

Verificar una Contraseña

Para verificar una contraseña ingresada por el usuario, compara el hash almacenado con la contraseña proporcionada:

const plainPassword = 'miContraseñaSegura';
const hashedPassword = '$2b$10$eW5JtOcCvfrE8W9bVbGh6.QWOv1kFDwVbRBqzBiYqMTlgxT.SQeK2'; // Ejemplo de hash previamente almacenado

bcrypt.compare(plainPassword, hashedPassword, function(err, result) {
  if (err) {
    console.error('Error verificando la contraseña:', err);
  } else if (result) {
    console.log('La contraseña es correcta.');
  } else {
    console.log('La contraseña es incorrecta.');
  }
});

Uso de crypto en JavaScript

crypto es un módulo incorporado en Node.js que también puede ser utilizado para encriptar contraseñas. Es especialmente útil para generar hashes y manejar funciones criptográficas.

Generación de Hash con crypto

A continuación, se muestra cómo generar un hash de una contraseña utilizando crypto:

const crypto = require('crypto');

const salt = crypto.randomBytes(16).toString('hex');
const plainPassword = 'miContraseñaSegura';

const hash = crypto.pbkdf2Sync(plainPassword, salt, 1000, 64, 'sha512').toString('hex');

console.log('Salt:', salt);
console.log('Hash:', hash);

En este ejemplo:

  • crypto.randomBytes genera una sal aleatoria.
  • crypto.pbkdf2Sync genera el hash utilizando el algoritmo PBKDF2 con SHA-512.

Verificar una Contraseña con crypto

Para verificar una contraseña usando crypto, debes volver a generar el hash usando la misma sal y comparar el resultado:

const salt = '3c6e0b8a9c15224a8228b9a98ca1531d'; // Ejemplo de sal previamente almacenada
const hashedPassword = '74b87337454200d4d33f80c4663dc5e5'; // Ejemplo de hash previamente almacenado
const plainPassword = 'miContraseñaSegura';

const hash = crypto.pbkdf2Sync(plainPassword, salt, 1000, 64, 'sha512').toString('hex');

if (hash === hashedPassword) {
  console.log('La contraseña es correcta.');
} else {
  console.log('La contraseña es incorrecta.');
}

Conclusión

La encriptación de contraseñas es una práctica esencial para proteger la información de los usuarios en cualquier aplicación web. Tanto bcrypt como crypto proporcionan métodos efectivos para encriptar y verificar contraseñas en JavaScript. bcrypt es más fácil de usar y específicamente diseñado para contraseñas, mientras que crypto ofrece más flexibilidad y control para tareas criptográficas generales. Utiliza estas herramientas para asegurar que las contraseñas de tus usuarios estén siempre protegidas.

Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer