Рейтинг:0

Возможна ли проверка надежности пароля на стороне сервера с помощью хеширования пароля на стороне клиента?

флаг in

Допустим, я хочу настроить на сервере классическую стратегию аутентификации по имени пользователя и паролю. Вся связь шифруется через TLS. Но в идеале я все же не хочу, чтобы сервер мог читать пароли в открытом виде, даже временно. С этой целью клиент может отправить пароль, который хэшируется и содержит какой-либо ключ (для простоты предположим, что это имя пользователя). Давайте назовем это полученный пароль. Затем сервер, в свою очередь, хешировал и соли производный пароль с использованием алгоритма, такого как Bcrypt или PBKDF2, и сохранял его для будущих запросов.

Пока все это не ново, и на эту тему ведется множество дискуссий. Но чего я не могу найти в этих обсуждениях, так это того, как выполнить проверку на стороне сервера сила принадлежащий простой текст пароль под вопросом? Любую проверку прочности на стороне клиента можно обойти, или в клиентском приложении может быть ошибка, которая недостаточно проверяет стойкость, поэтому проверку прочности следует выполнять на сервере. Но в то же время я не хочу, чтобы сервер имел доступ к текстовому паролю.

Итак, мой вопрос: эти два требования взаимоисключающие или есть способ выполнить оба требования? Можно ли выполнить проверку надежности на основе полученного пароля? По крайней мере, можно ли проверить длину открытого текста пароля, используя производный пароль, чтобы предотвратить регистрацию, скажем, с пустым паролем? Или я, как владелец проекта, просто должен признать, что некоторые пользователи могут обойти проверку на стороне клиента и не нести никакой ответственности, если их учетные записи будут скомпрометированы в результате обхода проверки на прочность на стороне клиента?

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

Рейтинг:3
флаг ca

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

Однако вы можете довольно легко убедиться, что пароль не принадлежит к короткому списку распространенных, слабых паролей, таких как пустая строка "", "abc", "123", "пароль" и т. д. Вы делаете это, просто повторение процедуры хеширования на стороне клиента с этими входными данными на стороне сервера и проверка на равенство. Длина списка таких слабых паролей будет ограничена ограничениями производительности. Поскольку хэш, отправленный клиентом, является сольным, серверу придется создавать этот список заново для каждой регистрации и смены пароля.

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

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

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

arslancharyev31 avatar
флаг in
«Вы делаете это, просто повторяя процедуру хеширования на стороне клиента с этими входными данными на стороне сервера и проверяя равенство». - Я не думал об этом подходе, но теперь вижу, как его можно эффективно использовать для предотвращения регистрации паролей из списка особых случаев (например, пустой строки). Спасибо.

Ответить или комментировать

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