Быстрый, но безопасный способ проверки пароля?
У меня есть клиент, подключающийся к серверу через Интернет (WCF
).
Чтобы вычислить хеш для сохранения в БД, которую я сейчас использую:
var hash = BCrypt.HashPassword(password, 13);
Чтобы проверить это я делаю:
var isApproved = BCrypt.Verify(passwordFromUser, hashFromDatabase);
Генерация хэша должна быть интенсивной по вычислениям, правда. Но проверка тоже должна быть интенсивной?
Не существует безопасного, но более быстрого способа проверки пользователя (это делается на сервере)?
2 ответа
Да, проверка должна быть интенсивной. Действительно, гораздо важнее, чтобы проверка была интенсивнее, чем исходное поколение. (Трудно понять, как у вас будет дешевая генерация и дорогостоящая проверка, но это было бы хорошо.)
Дело в том, что если проверка пароля обходится дешево, то злоумышленник может быстро проверить множество паролей. Однако, если вы сделаете проверку каждой догадки дорогостоящей, станет гораздо менее целесообразно применить грубую силу для взлома пароля.
Несмотря на то, что проверка является относительно дорогой, она все равно вряд ли будет очень значительной затратой при работе обычного приложения, если только вы не атакованы (в этот момент вы не хотите, чтобы проверка происходила быстро). Если вы получаете достаточно законных попыток входа в систему, чтобы ваш сервер перешел в любой пот, это говорит о том, что у вас достаточно пользователей, которые вы, вероятно, можете позволить себе несколько масштабировать...
Проверка должна требовать значительных вычислительных ресурсов, поэтому при краже базы паролей дорого восстанавливать пароли путем быстрой проверки их большого количества, как объяснил Джон Скит.
Однако в обычной работе, когда клиент подключается к вашему серверу через Интернет, вы можете запретить злоумышленнику проверять множество паролей, просто ограничивая количество попыток аутентификации со стороны клиента. В этом случае немного нежелательно, чтобы сервер выполнял дорогостоящую проверку, поскольку сервер является "хорошим парнем".
Взгляните на механизм аутентификации в ответе Salted Challenge (SCRAM), который предоставляет механизм, при котором проверка разделяется между клиентом и сервером, и клиент поднимает тяжелую часть.