Очевидно, что точка недели в этом подходе состоит в том, что злоумышленник может легко видеть соль для любого пользователя.
Нет, слабый момент заключается в том, что ваш сервер доверяет клиенту. Вот краткое и острое заключение MSDN о ситуации:
Вы не должны доверять пользовательскому вводу напрямую, особенно если пользовательский ввод является анонимным. Помните два золотых правила: никогда не доверяйте пользовательскому вводу и всегда проверяйте данные при переходе от ненадежного к доверенному домену.
Источник: Do Not Trust User Input Directly
Здесь у вас есть пользовательские данные, перемещающихся с их ненадежного клиента к серверу. Вы должны подтвердить их ввод на своем сервере.Нет атаки, которую можно предотвратить, выполняя генерацию соли и хеширование пароля на клиенте. Единственный способ обеспечить связь между сервером и клиентом - это безопасный обмен ключами для установления асимметричного шифрования. Это происходит через HTTPS, и после того, как ссылка защищена, отправка пароля в виде открытого текста не менее опасна, чем отправка кода клиенту для выполнения клиентской стороны хеширования.
Если вы не защищаете соединение с клиентом HTTPS, вы всегда уязвимы для атаки «Человек-в-центре». Несмотря на то, что при возврате на ваш сервер номинально скрывается пароль, злоумышленник может вместо этого выдавать себя за клиента клиенту, отправляя HTML-форму, которая пропускает хэш или отправляет пароль в текстовом виде на свой сервер.
Разоблачение соли по вашему сценарию - - дополнительное отверстие для безопасности, но оно незначительно рядом со сверкающим отверстием, которое позволит злоумышленнику получить пароль напрямую. Я могу объяснить эту атаку дальше, если вы пожелаете, но это абсолютно бессмысленная атака, если только сам пароль не будет лучше защищен; и как только это произойдет, вам не нужно подвергать соль в первую очередь.
В ответ на замечания, это правда, что соли могут быть общеизвестные без снижения безопасности, если вы уверены, что они были созданы правильно. Для соли это означает, что они имеют достаточную длину, достаточно случайную, а в некоторых схемах - cryptographically secure. Проблема в том, что вы разрешаете клиенту генерировать соль, а это значит, что мы все согласны сейчас, что им нельзя доверять. Возможно, злоумышленник испортил внешнюю библиотеку, на которую вы полагаетесь для PRNG. Возможно, у некоторых пользовательских устройств недостаточно entropy pool. Возможно, их устройство не защищено от side-channel attacks. Если вы создаете приложение для Android, там, безусловно, есть некоторые очень небезопасные устройства. В огороженном саду Apple эти риски могут быть довольно низкими, но вы никогда не сможете их устранить.
Как я уже сказал, эти риски являются незначительными рядом с реальными опасностями вашей схемы. А именно, вы передаете хеш-код, переданный в поле clear на ваш сервер. Даже если вы добавили его еще до его хранения в своей базе данных, поэтому SQL-инъекция не может просто сбросить все пароли пользователей, вы все еще уязвимы для атак типа «человек в центре». Незашифрованный HTTP-трафик можно наблюдать и записывать любым маршрутизатором, через который он проходит. После того, как злоумышленник соблюдает хешированный пароль, они могут повторно отправить тот же запрос на ваш сервер и пройти проверку подлинности неправильно.
никогда ничего не делайте с клиентами. клиент должен отправить пароль на сервер, а сервер выполнит хеширование/проверку. «О, ты проиграл вчера вечером 5 долларов США? Вот наш весь денежный взнос с прошлой недели. Не стесняйтесь брать его домой и просматривать его за ваши 5 долларов. Но будьте честны и не принимайте ничего, чтобы подталкивать подталкивать подмигивание « –
Недостатком является то, что клиент не может без сомнения доказать серверу, что аутентификация действительно произошла. –
@ArtjomB. не могли бы вы рассказать об этом более детально? Я не следую .. –