El hashing de contraseñas es una técnica indispensable cuando se trata de la seguridad de la información en aplicaciones web. No guardar las contraseñas en crudo en tu base de datos es fundamental, ya que permite minimizar riesgos de seguridad. Las contraseñas deben estar encriptadas para protegerlas, incluso de los administradores y cualquier parte del equipo que tenga acceso a la base de datos. En esta guía, aprenderás cómo implementar el hashing de contraseñas de forma eficaz utilizando la librería bcrypt.
¿Cómo funciona el hashing de contraseñas?
Para proteger las contraseñas, no basta con un simple cifrado. El hashing genera una representación única de la contraseña mediante un algoritmo específico. Esto es lo que realmente debemos almacenar en nuestras bases de datos, no la contraseña original. Pero, ¿qué sucede cuando un usuario ingresa de nuevo su contraseña? Necesitamos saber si coincide con el hash almacenado. Veamos cómo realizar todo el proceso.
Implementando el hashing de contraseñas con bcrypt
Instalación de bcrypt
Para comenzar, es crucial contar con la librería bcrypt que nos permitirá realizar el hashing:
npminstall bcrypt
Creación del archivo de ejecución
Primero, crea un nuevo archivo llamado passwordHash.js y sigue los pasos a continuación.
saltRounds determina cuántas veces se aplica el algoritmo para fortalecer el hash.
Usamos bcrypt.hash() que es una función asíncrona para obtener la contraseña encriptada y almacenarla.
Verificación de Contraseñas
Creación del archivo de verificación
Para verificar contraseñas, crea un archivo nuevo llamado passwordVerify.js.
Utilizando bcrypt para verificar
asyncfunctionverifyPassword(){const myPassword ="una_contraseña_segura";const hash ="el_hash_de_tu_contraseña";// Reemplaza con el hash generado previamenteconst isMatch =await bcrypt.compare(myPassword, hash);console.log(isMatch ?"Contraseña correcta":"Contraseña incorrecta");}verifyPassword();
Con este código:
Comparamos la contraseña ingresada por el usuario con el hash almacenado.
bcrypt.compare() retorna true si coinciden, o false si no.
Recomendaciones prácticas para la implementación
Asegúrate de nunca almacenar contraseñas en crudo.
Incrementa la seguridad usando un número elevado de saltRounds, generalmente un valor de 10 es suficiente.
Integrar estos mecanismos de seguridad en tu API es crucial para proteger a los usuarios.
Realiza pruebas exhaustivas para garantizar que los procesos de hashing y verificación funcionan correctamente.
La correcta implementación de hashing y verificación protegerá la privacidad de tus usuarios, mientras fortalece la seguridad de tu aplicación. ¡Sigue aprendiendo y garantizando la seguridad digital!
Hashing de Contraseñas con BYNCrip: Seguridad y Verificación
Hashing de Contraseñas con BYNCrip: Seguridad y Verificación
Recursos
Resumen
¿Por qué es necesario encriptar contraseñas?
El hashing de contraseñas es una técnica indispensable cuando se trata de la seguridad de la información en aplicaciones web. No guardar las contraseñas en crudo en tu base de datos es fundamental, ya que permite minimizar riesgos de seguridad. Las contraseñas deben estar encriptadas para protegerlas, incluso de los administradores y cualquier parte del equipo que tenga acceso a la base de datos. En esta guía, aprenderás cómo implementar el hashing de contraseñas de forma eficaz utilizando la librería bcrypt.
¿Cómo funciona el hashing de contraseñas?
Para proteger las contraseñas, no basta con un simple cifrado. El hashing genera una representación única de la contraseña mediante un algoritmo específico. Esto es lo que realmente debemos almacenar en nuestras bases de datos, no la contraseña original. Pero, ¿qué sucede cuando un usuario ingresa de nuevo su contraseña? Necesitamos saber si coincide con el hash almacenado. Veamos cómo realizar todo el proceso.
Implementando el hashing de contraseñas con bcrypt
Instalación de bcrypt
Para comenzar, es crucial contar con la librería bcrypt que nos permitirá realizar el hashing:
npm install bcrypt
Creación del archivo de ejecución
Primero, crea un nuevo archivo llamado passwordHash.js y sigue los pasos a continuación.
Comparamos la contraseña ingresada por el usuario con el hash almacenado.
bcrypt.compare() retorna true si coinciden, o false si no.
Recomendaciones prácticas para la implementación
Asegúrate de nunca almacenar contraseñas en crudo.
Incrementa la seguridad usando un número elevado de saltRounds, generalmente un valor de 10 es suficiente.
Integrar estos mecanismos de seguridad en tu API es crucial para proteger a los usuarios.
Realiza pruebas exhaustivas para garantizar que los procesos de hashing y verificación funcionan correctamente.
La correcta implementación de hashing y verificación protegerá la privacidad de tus usuarios, mientras fortalece la seguridad de tu aplicación. ¡Sigue aprendiendo y garantizando la seguridad digital!
Esta libreria es muy util para muchas otras cosas mas, porque hay ciertas legislaciones que sancionan si se tiene información sencible de los usuarios sin estar protegida como por ejemplo, nombre completo, dirección de email, direccion postal entre otras
con esta libreria se puede implementar una rutina que al momento de guardar información sencible la encripte y luego la guarde en la base de datos y cuando deba ser consultada por usuarios esta infirmación sea desencriptada para luego ser mostrada. Asi la infirmación guardada si llega a ser comprometida no podrá ser desencriptada a menos que se dispongan de las claves de encriptación y desencriptación
El hashing de contraseñas encripta (hashea) el password para poder guardarlo en la base de datos ya que por motivos de seguridad no es recomendado guardar el password en crudo.
Instalar bcrypt: npm i bcrypt
Para hashear una contraseña usando bcrypt se hace el uso de la función .hash(), esta función recibe como primer parámetro la contraseña y después el número de salt. Esta función devuelve una promesa que se puede manejar con async/await, por ejemplo:
Para verificar la contraseña se necesita el password en crudo y el hash generado, con ello se hace el uso de la función .compare() que recibe como primer parámetro la contraseña en crudo y después el hash. Esta función devuelve un booleano, por ejemplo:
En el minuto 5:30 podemos ver que la salida de BCrypt es distinta aún para el mismo password. Esta es la función de salt (también conocida como sal). Esta sal permite, por ejemplo, que si 2 o mas usuarios tuvieran el mismo password en la base de datos veríamos cadenas de texto distintas para cada uno de ellos
Clase #5: Hashing de contraseñas con bcryptjs 5/20 🔒
¿Qué es el hash y para qué sirve? 🔐
Los hashes criptográficos se utilizan principalmente para proteger las contraseñas y no guardarlas en texto claro en una base de datos (fuente: aquí).
¿Qué significa agregar un 'salt' a una contraseña / hash? 🔏
Salt es un número de dígitos aleatorios (cadena) que se le agrega a la contraseña ya sea al principio o al final y que el usuario no conocerá (fuente: aquí).
Continuando con el Proyecto: 📝 :
Cómo no podemos guardar el password en crudo, debemos usar un hashing de contraseñas (encriptarlas).
Pasos:
Vamos a la terminal (dentro de la carpeta del proyecto) e instalamos:
npm i bcrypt
Al instalar correctamente debe salir: found 0 vulnerabilities
Vamos a VSC, creamos el archivo pass-hash.js y colocamos el siguiente código:
const bcrypt = require('bcrypt');
async function hashPassword() {
const myPassword = 'admin 123 .202';
//Con la función hash usando bcrypt,
//se debe enviar el password y cuántas veces va a generar el encriptado (saltos)
const hash = await bcrypt.hash(myPassword, 10);
console.log(hash);
}
hashPassword();
Cuando se quiere consultar a la API, se va a enviar una contraseña, en el código se encuentra la función hash() donde enviamos el password y un número que indica cuántas veces se va a generar el encriptado (número de saltos); cómo este método es asíncrono, éste devuelve una promesa. Con bcrypt se hace un hash.
Guardamos y para correrlo dentro de VSC, en la esquina superior derecha del archivo se encuentra el triangulo apuntando a la derecha, se presiona y se ejecuta el programa, abajo en el cuadro de dialogo, en la pestaña “output” aparecerá el password transformado:
[Running] node "/home/marigabi/projects/platzi-backend-node-jwt/my-store-auth/pass-hash.js"
$2b$10$f.QqlNHMe/nr2oCbI98lpOxXP.ds5iwFkwalcxfCBr.h.l7Hyo0xu
[Done] exited with code=0 in 2.516 seconds
Después de los primeros dígitos, muestra el números de saltos que fueron necesarios para encriptar.
Para verificar si la contraseña es correcta, se crea un nuevo archivo en VSC llamado pass-veriy.js, el código queda:
Con el método compare() si regresa un true, quiere decir que el password coincide y es correcto, de lo contrario el usuario no tiene permitido el acceso.
Guardamos y corremos con el botón play (triangulo), en el panel de salida (output) sale:
[Running] node "/home/marigabi/projects/platzi-backend-node-jwt/my-store-auth/pass-verify.js"
true
[Done] exited with code=0 in 0.474 seconds
Entre mayor sea el numero de saltos mayor sera la dificultad de la encriptacion por tanto sera +SEGURA pero sera +LENTO conseguirla y el async tardara mas en responder
Un Hash es una función matemática que a partir de una cierta cadena alfanumérica, se obtiene otra reducida. Es como si fuese un serial de la cadena original. La particularidad que tiene es que este proceso es irreversible. Teniendo un hash es imposible reproducir el original en forma directa.
Por eso en los sistemas en vez de almacenar las claves, es mas seguro hacerlo con el hash, ya que si estos son comprometidos, carecen de valor al no poder revertirlos.
Cabe también aclarar, aunque es muy difícil, que teóricamente dos cadenas alfanuméricas pueden dar como resultado el mismo hash.
Hay algo que no entiendo. ¿Por qué cuando repito la ejecución para generar un hash a partir de un texto es uno totalmente distinto, ¿Si no cambie la entrada, porque cambia la salida?