Какой смысл хэшировать пароли в базе данных?

Я заметил, что в большинстве учебных пособий говорится, что вы должны зашифровать пароли перед отправкой. Это также показывает, как их можно дешифровать. Если я могу это сделать, разве они тоже не могут?

Это пример из среднего

UserSchema.pre('save', function (next) {
  var user = this;
  bcrypt.hash(user.password, 10, function (err, hash){
    if (err) {
      return next(err);
    }
    user.password = hash;
    next();
  })
});

Они говорят, чтобы хэш это здесь

bcrypt.compare(password, user.password, function (err, result) 

Здесь они распаковывают его, когда пользователь пытается войти в систему. Что смущает меня, если толстый, что, если они могут так легко распаковать его, атакующий тоже не сможет его распаковать? Может кто-то объяснить это мне?

2 ответа

Решение

С оговоркой, что, хотя я написал системы учетных записей пользователей и использовал безопасные хеш-функции, я не какой-то "эксперт", но для тех, кто пришел к этому вопросу, интересует, действительно ли вам придется пережить проблему использование безопасного хэша для хранения пароля: да, вы делаете.

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

В любом случае, как уже упоминалось в комментариях, безопасный хэш предназначен для хранения паролей (например, bcrypt или же scrypt) имеет API, который обрабатывает всю грязную работу. Я более знаком с scrypt но они похожи. Хешированный пароль выглядит как строка случайных символов, но в начале строки находятся две отдельные части, которые содержат случайную соль и параметры хеширования.

Поскольку безопасный хэш для хранения паролей всегда будет хэшировать пароль любой длины и превращать его в хешированную строку некоторого фиксированного размера, нет веской причины ограничивать пароли пользователей любой длиной (кроме примерно 1000 символов только для того, чтобы избежать атак DOS),

Какой смысл хэшировать пароли в базе данных?

Это ограничивает потенциальные последствия взлома базы данных, поскольку злоумышленники не получат незашифрованные пароли. Это очень важно, поскольку пользователи часто используют пароли повторно.

Если я могу это сделать, разве они тоже не могут?

bcrypt это односторонний шифр. Как только открытый текст закодирован, вы не получите его обратно.

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

Это означает, что даже если злоумышленник получит соль и хэш, ему все равно придется угадать пароль. Bcrypt имеет встроенную стоимость (медлительность), что делает тестирование радужной таблицы возможных паролей чрезвычайно дорогостоящим.

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