Использование CHAP с хешированным паролем scrypt в базе данных в NodeJS
Я знаю, что TLS, особенно правильно настроенный TLS, достаточно хорош для защиты связи между браузером и сервером. Я также знаю, что хэширование на клиенте увеличивает накладные расходы и мало что дает. Для некоторых они скажут, что хеширование пароля на стороне клиента является обязательным. Для некоторых это накладные расходы и TLS достаточно.
Тем не менее, я все еще хотел бы сделать подтверждение концепции, которая позволит предотвратить атаки повторного воспроизведения. Из того, что я прочитал, протокол аутентификации nonce и challenge может предотвратить атаки воспроизведения. В настоящее время я использую scrypt для проверки хэша пароля по отношению к сохраненному хешу.
Я хотел бы добавить еще один уровень безопасности, добавив CHAP или добавив одноразовый номер, сгенерированный и отправленный сервером клиенту. Тем не менее, я не могу понять поток. Я также думаю, что хеширование пароля, соединенного с nonce на стороне клиента, может не сработать, так как хеш-строка, генерируемая скриптом, часто меняется даже с одним и тем же вводом.
Если бы вы могли предоставить рабочий блок кода, это было бы здорово!
Вот мой код в настоящее время
function verifyPassword(password, attempt) {
return scrypt.verifyHash(password, attempt)
.then(() => true)
.catch(scrypt.PasswordError, () => false)
}
// Endpoint: /api/v1/auth/login
router.route('/login')
.post(parseForm, csrfProtection, (req, res, next) => {
sess = req.session
const user_id = req.body.user_id
const password = req.body.password
let response = {}
Promise.try(() => {
return db.findUserByEmail(user_id)
})
.then((user) => {
return user ? verifyPassword(password, user.password) : false
})
.then((isValid) => {
if (!isValid) return res.status(401).json({ status: 401, message: "Please try again!", authenticated: isValid })
res.status(200).json({ status: 200, message: "Login successful!", authenticated: isValid, user_id: user_id, views: sess.views })
})
.catch((err) => {
next(err)
})
});