Пакет 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
Если вы запустите bcrypt.hash() несколько раз, результат будет постоянно меняться. Это важно, потому что невозможно восстановить исходный пароль по хэшу.
Учитывая тот же пароль и хэш, можно узнать, был ли хэш создан на основе этого пароля, используя функцию bcrypt.compare() :
bcrypt.compare(password, hash, (err, res) => {
if (err) {
console.error(err)
return
}
console.log(res) //true or false
})Если это так, то пароль соответствует хэшу, и, например, мы можем разрешить пользователю успешно войти в систему.
Вы также можете использовать библиотеку bcrypt с ее API на основе обещаний вместо обратных вызовов:
const hashPassword = async () => {
const hash = await bcrypt.hash(password, rounds)
console.log(hash)
console.log(await bcrypt.compare(password, hash))
}
hashPassword()Проверьте пару примеров в этом глюке :
Оригинал: “https://flaviocopes.com/javascript-bcrypt/”