Cómo utilizar la biblioteca bcrypt de JavaScript

Descubra cómo aplicar hash y comprobar contraseñas en JavaScript con la biblioteca bcrypt

El paquete bcrypt npm es uno de los paquetes más utilizados para trabajar con contraseñas en JavaScript.

Esto es seguridad básica, pero vale la pena mencionarlo para los nuevos desarrolladores: nunca almacena una contraseña en texto sin formato en la base de datos o en cualquier otro lugar. Simplemente no lo haces.

En cambio, lo que haces es generar un hash a partir de la contraseña y lo almacenas.

De este modo:

import bcrypt from 'bcrypt'
// or
// const bcrypt = require('bcrypt')

const password = 'oe3im3io2r3o2'
const rounds = 10

bcrypt.hash(password, rounds, (err, hash) => { if (err) { console.error(err) return } console.log(hash) })

Pasas un número como segundo argumento y cuanto más grande es, más seguro es el hash. Pero también más se tarda en generarlo.

La biblioteca README nos dice que en un núcleo de 2GHz podemos generar:

rounds=8 : ~40 hashes/sec
rounds=9 : ~20 hashes/sec
rounds=10: ~10 hashes/sec
rounds=11: ~5  hashes/sec
rounds=12: 2-3 hashes/sec
rounds=13: ~1 sec/hash
rounds=14: ~1.5 sec/hash
rounds=15: ~3 sec/hash
rounds=25: ~1 hour/hash
rounds=31: 2-3 days/hash

If you run bcrypt.hash() multiple times, the result will keep changing. This is key because there is no way to reconstruct the original password from a hash.

Given the same password and a hash it’s possible to find out if the hash was built from that password, using the bcrypt.compare() function:

bcrypt.compare(password, hash, (err, res) => {
  if (err) {
    console.error(err)
    return
  }
  console.log(res) //true or false
})

If so, the password matches the hash and for example we can let a user log in successfully.

You can use the bcrypt library with its promise-based API too, instead of callbacks:

const hashPassword = async () => {
  const hash = await bcrypt.hash(password, rounds)
  console.log(hash)
  console.log(await bcrypt.compare(password, hash))
}

hashPassword()

Check a couple examples in this Glitch:


More js tutorials: