Как хешировать и проверять пароль в Node.js с помощью bcrypt
Если вы работаете с паролями пользователей, вы обязаны делать это безопасно. Библиотека bcrypt облегчает этот процесс.
Один из лучших способов безопасного хранения паролей — это их соль и хеширование. Соление и хеширование преобразуют простой пароль в уникальное значение, которое трудно отменить. Библиотека Bcrypt позволяет хешировать и солить пароли в Node.js с минимальными усилиями.
Что такое хеширование паролей?
Хеширование пароля означает передачу обычного текстового пароля через алгоритм хеширования для создания уникального значения. Это уникальное значение называется хешем. Некоторыми примерами алгоритмов хеширования являются bcrypt, scrypt и SHA.
Одним из основных свойств хорошего алгоритма хеширования является то, что он генерирует одинаковый результат для одних и тех же входных данных. Эта предсказуемость делает хэши уязвимыми для атак методом перебора. Хакер может предварительно вычислить хеш-значения для многих часто используемых входных данных, а затем сравнить их со значениями хеш-функций в целевых значениях. Вы можете смягчить эту уязвимость, используя засолку.
Что такое засолка паролей?
Соль паролей добавляет к паролю случайную строку (соль) перед его хешированием. Таким образом, сгенерированный хэш всегда будет каждый раз разным. Даже если хакер получит хешированный пароль, ему потребуется немало времени, чтобы обнаружить исходный пароль, который его сгенерировал.
Как использовать Bcrypt для хеширования и проверки пароля
bcrypt — это модуль npm, который упрощает хеширование паролей в Node.js. Чтобы использовать его, выполните следующие действия:
Шаг 1. Установите Bcrypt
Установите bcrypt, выполнив следующие команды терминала.
Использование НПМ:
npm install bcrypt
Использование пряжи:
yarn add bcrypt
Шаг 2. Импортируйте Bcrypt.
В верхней части файла JavaScript импортируйте Bcrypt.
const bcrypt = require("bcrypt")
Шаг 3: Создайте соль
Вызовите метод bcrypt.genSalt(), чтобы сгенерировать соль. Этот метод принимает целочисленное значение, которое является фактором стоимости, определяющим время, необходимое для хеширования пароля. Чем выше коэффициент стоимости, тем больше времени занимает алгоритм и тем сложнее отменить зашифрованный пароль с помощью грубой силы.
Хорошее значение должно быть достаточно высоким, чтобы обеспечить безопасность пароля, но также и достаточно низким, чтобы не замедлять процесс. Обычно оно находится в диапазоне от 5 до 15. В этом уроке мы будем использовать 10.
bcrypt.genSalt(10, (err, salt) => {
// use salt to hash password
})
Шаг 4: Хэшируйте пароль
В функции bcrypt.genSalt передайте простой пароль и сгенерированную соль в метод bcrypt.hash() для хеширования пароля.
bcrypt.genSalt(10, (err, salt) => {
bcrypt.hash(plaintextPassword, salt, function(err, hash) {
// Store hash in the database
});
})
После того как вы сгенерировали хеш, сохраните его в базе данных. Вы будете использовать его для проверки пароля и аутентификации пользователя, пытающегося войти в систему.
Вместо того, чтобы генерировать соль и хэш отдельно, вы также можете автоматически генерировать соль и хэш, используя одну функцию.
bcrypt.hash(plaintextPassword, 10, function(err, hash) {
// store hash in the database
});
Шаг 5. Сравните пароли с помощью bcrypt
Для аутентификации пользователей вам необходимо сравнить предоставленный ими пароль с паролем в базе данных с помощью функции bcrypt.compare(). Эта функция принимает простой текстовый пароль и хэш, который вы сохранили, вместе с функцией обратного вызова. Этот обратный вызов предоставляет объект, содержащий все произошедшие ошибки, а также общий результат сравнения. Если пароль соответствует хешу, результат верен.
bcrypt.compare(plaintextPassword, hash, function(err, result) {
if (result) {
// password is valid
}
});
Использование Async/Await
Вы можете зашифровать пароли в Node.js с помощью Bcrypt, используя async/await, следующим образом.
async function hashPassword(plaintextPassword) {
const hash = await bcrypt.hash(plaintextPassword, 10);
// Store hash in the database
}
// compare password
async function comparePassword(plaintextPassword, hash) {
const result = await bcrypt.compare(plaintextPassword, hash);
return result;
}
Использование обещаний
Библиотека bcrypt также поддерживает использование промисов. Например, вот функция, которая хэширует пароль с помощью блока then...catch.
function hashPassword(plaintextPassword) {
bcrypt.hash(plaintextPassword, 10)
.then(hash => {
// Store hash in the database
})
.catch(err => {
console.log(err)
})
}
Аналогично, эта функция сравнивает простой пароль пользователя с хешированным паролем, используя обещания.
function comparePassword(plaintextPassword, hash) {
bcrypt.compare(plaintextPassword, hash)
.then(result => {
return result
})
.catch(err => {
console.log(err)
})
}
Хеширование и соление — легкая победа
Вы можете использовать библиотеку Bcrypt для хэширования и проверки паролей в Node.js. Хеширование паролей сводит к минимуму шансы киберпреступников получить доступ к простым паролям и использовать их для доступа к конфиденциальным данным или услугам.
Соление ваших хешированных паролей делает их еще более безопасными. Помимо хеширования, всегда проверяйте надежность пароля в качестве дополнительной меры безопасности.