Как использовать библиотеку JavaScript bcrypt

Узнайте, как хешировать и проверять пароли в JavaScript с помощью библиотеки bcrypt

Пакет bcrypt npm - один из наиболее часто используемых пакетов для работы с паролями в JavaScript.

Это безопасность 101, но ее стоит упомянуть новым разработчикам: вы никогда не храните пароль в виде обычного текста в базе данных или в любом другом месте. Просто нет.

Вместо этого вы генерируете хэш из пароля и сохраняете его.

Таким образом:

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

Вы передаете число в качестве второго аргумента, и чем оно больше, тем надежнее хэш. Но также тем больше времени требуется на его создание.

Библиотека README сообщает нам, что на ядре с частотой 2 ГГц мы можем генерировать:

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: