Мы используем bcrypt для хеширования паролей пользователей, и мы сохраняем список последних 10 хэшей, чтобы убедиться, что они не используют тот же пароль, что и последние 10, когда они создают новый.Медленная проверка истории паролей с использованием BCrypt
Одна проблема, с которой мы сталкиваемся, заключается в том, что проверка истории паролей является очень медленным процессом. Алгоритм выходит что-то вроде этого:
// The user's entered password on the password change page
String rawPassword = ...
// For demonstration purposes, the password has passed all other validation measures
Boolean passwordIsValid = true;
// Loop through all the stored passwords we have for that user. We have a max of 10
for (String oldHashed: user.passwordHashHistory) {
// Must re-hash every time using the same salt as the one stored in history
// NOTE: SLLOOOWWWWW!
String newHashed = Bcrypt.hashPw(rawPassword, oldHashed);
// Now we can see if it's a match
if (newHashed.compareTo(oldHashed) == 0) {
// User is using one of the old passwords
passwordIsValid = false;
}
}
выше код работает, но это может занять 5-6 секунд на моей рабочей станции для одного пользователя, чтобы проверить его пароль изменен. Могу ли я сделать что-нибудь, чтобы уменьшить это, сократив количество журналов или увеличив количество серверов?
Это понятно. Я все еще не понимаю, как выполнить требование истории паролей с помощью медленной хеш-функции, то есть посмотреть, как это решили другие. Например, если есть нарушение, и нам нужно, чтобы все изменили свои пароли, это теоретически сделало бы систему непригодной для использования, поскольку все ресурсы собираются в вычислениях хэшей bcrypt. – Joe
@Joe - Я думаю, вопрос в том, действительно ли история из 10 запоминаемых паролей имеет смысл. Если вы сталкиваетесь с такими ограничениями, вы часто получаете более слабые пароли, потому что пользователи не могут запомнить тонны надежных паролей. Они могут стать очень изобретательными («пароль-1», «пароль-2», ...). Если вы действительно не можете избежать этого требования, имейте в виду, что смена пароля - редкая вещь. В случае возникновения чрезвычайной ситуации вы можете пропустить это ограничение и проверить только последний пароль. В любом случае я никогда не уменьшу безопасность, уменьшив фактор затрат в пользу такого требования. – martinstoeckli
@Joe - Если кто-то предлагает такую систему с проверкой последних 10 паролей, вы можете быть уверены, что его система использует слабый алгоритм хэша (или пользователь должен ждать). – martinstoeckli