2014-11-20 3 views
0

Мы используем 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 секунд на моей рабочей станции для одного пользователя, чтобы проверить его пароль изменен. Могу ли я сделать что-нибудь, чтобы уменьшить это, сократив количество журналов или увеличив количество серверов?

ответ

1

Алгоритм BCrypt был разработан точно для того, чтобы быть медленным, и с учетом фактора затрат вы можете определить, сколько времени требуется для вычисления хэша паролей. Эта «медлительность» - единственный способ помешать атакам грубой силы.

Если бы был способ ускорить этот процесс, злоумышленник наверняка воспользовался бы им. Так что нет никакого способа сделать короткие сокращения здесь.

+0

Это понятно. Я все еще не понимаю, как выполнить требование истории паролей с помощью медленной хеш-функции, то есть посмотреть, как это решили другие. Например, если есть нарушение, и нам нужно, чтобы все изменили свои пароли, это теоретически сделало бы систему непригодной для использования, поскольку все ресурсы собираются в вычислениях хэшей bcrypt. – Joe

+1

@Joe - Я думаю, вопрос в том, действительно ли история из 10 запоминаемых паролей имеет смысл. Если вы сталкиваетесь с такими ограничениями, вы часто получаете более слабые пароли, потому что пользователи не могут запомнить тонны надежных паролей. Они могут стать очень изобретательными («пароль-1», «пароль-2», ...). Если вы действительно не можете избежать этого требования, имейте в виду, что смена пароля - редкая вещь. В случае возникновения чрезвычайной ситуации вы можете пропустить это ограничение и проверить только последний пароль. В любом случае я никогда не уменьшу безопасность, уменьшив фактор затрат в пользу такого требования. – martinstoeckli

+2

@Joe - Если кто-то предлагает такую ​​систему с проверкой последних 10 паролей, вы можете быть уверены, что его система использует слабый алгоритм хэша (или пользователь должен ждать). – martinstoeckli

Смежные вопросы