Использование 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)
  })
});

0 ответов

Другие вопросы по тегам