Comment utiliser la bibliothèque JavaScript bcrypt

Découvrez comment hacher et vérifier les mots de passe en JavaScript avec la bibliothèque bcrypt

Le package bcrypt npm est l'un des packages les plus utilisés pour travailler avec des mots de passe en JavaScript.

C'est la sécurité 101, mais cela vaut la peine d'être mentionné pour les nouveaux développeurs: vous ne stockez jamais un mot de passe en texte brut dans la base de données ou ailleurs. Vous ne le faites pas.

À la place, vous générez un hachage à partir du mot de passe et vous le stockez.

De cette façon:

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) })

Vous passez un nombre comme deuxième argument et plus il est grand, plus le hachage est sécurisé. Mais aussi plus il faut de temps pour le générer.

La librairie README nous dit que sur un core 2GHz on peut générer:

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: