Я пытался решить аналогичную проблему, когда на сервере можно было записать простой текстовый пароль.Вывод таков: вы всегда должны дополнительно хэшировать пароль клиента , если можете.
В веб-приложении всегда хэш на сервере
Если вы пишете веб-приложение, вы можете задаться вопросомгде хешироватьНужно ли хешировать пароль в браузере пользователя с помощью JavaScript или его следует отправлять на сервер «в открытом виде» и хэшировать там?
Даже если вы хэшируете пароли пользователей в JavaScript, вам все равно придетсяхэш хэши на сервере.Рассмотрим веб-сайт, который хэширует пароли пользователей в браузере пользователя без хэширования на сервере.Чтобы аутентифицировать пользователя, этот веб-сайт примет хеш от браузера и проверит, точно ли этот хеш совпадает с хешем в базе данных.Это кажется более безопасным, чем простое хеширование на сервере, поскольку пароли пользователей никогда не отправляются на сервер, но это не так.
Проблема в том, что хэш на стороне клиента логически становится паролем пользователя.Все, что нужно пользователю для аутентификации - это сообщить серверу хэш своего пароля.Если злоумышленник получил хеш пользователя, он может использовать его для аутентификации на сервере, не зная пароля пользователя!Таким образом, если злоумышленник каким-то образом похитит базу данных хэшей с этого гипотетического веб-сайта, он получит немедленный доступ ко всем учетным записям без необходимости угадывать пароли.
Это не означает, что выне должен хешироваться в браузере, но если вы делаете, то вам абсолютно необходимо хешировать и на сервере.Хеширование в браузере , безусловно, является хорошей идеей, но учтите следующие моменты для вашей реализации:
Хеширование пароля на стороне клиента не заменяетHTTPS (SSL / TLS).Если соединение между браузером и сервером небезопасно, посредник может изменить код JavaScript по мере его загрузки, чтобы удалить функцию хеширования и получить пароль пользователя.
Некоторые веб-браузеры не работаютне поддерживают JavaScript, и некоторые пользователи отключают JavaScript в своем браузере.Поэтому для максимальной совместимости ваше приложение должно определить, поддерживает ли браузер JavaScript и эмулировать хеш на стороне клиента на сервере, если это не так.
Вам также нужно посолить хэши на стороне клиента.Очевидное решение - заставить клиентский скрипт запрашивать у пользователя соль для сервера.Не делайте этого, потому что это позволяет плохим парням проверять правильность имени пользователя, не зная пароля.Поскольку вы также хэшируете и солите (с хорошей солью) на сервере, можно использовать имя пользователя (или адрес электронной почты), объединенное со строкой, специфичной для сайта (например, именем домена), в качестве соли на стороне клиента.
После исследования кажется очевидным преимущество безопасности при хешировании клиента.Если пароль через HTTPS скомпрометирован или пароль зарегистрирован на сервере, то открытый текстовый пароль не может быть легко повторно использован в других учетных записях пользователя (многие пользователи используют свои пароли).
Единственно возможныйНедостатком является производительность клиента и проверка пароля на стороне сервера.Пользователь может манипулировать вашим клиентом JS и ввести «слабый» пароль.Сервер не знал бы лучше.Но я думаю, что это небольшая проблема, и она полагается на то, что люди намеренно изменяют свой клиентский код, чтобы ослабить собственную безопасность.