Мы разрабатываем конечную точку API, которую клиенты смогут использовать для входа в нашу службу. Однако у меня есть вопрос о том, как убедиться, что пароль пользователя защищен при использовании незащищенной сети.
Поразмыслив над этой проблемой, мы пришли к выводу, что можем изменить наше приложение, чтобы оно запрашивало одноразовый номер перед попыткой входа в систему [два запроса на каждую попытку входа], а затем хешировать пароль пользователя, прежде чем пытаться отправить его по сети. Это решает проблему с отправкой пароля пользователя через незащищенную сеть, и в качестве дополнительного бонуса мы можем проверить одноразовый номер и сделать его недействительным, чтобы предотвратить любые последующие ответные атаки.
Однако для того, чтобы это работало, я не нашел способа использовать соль в механизме хеширования, как если бы мы это сделали, пользователь не может сгенерировать правильный хеш или нам нужно отправить соль пользователю.
Сейчас у меня в голове следующее:
- Приложение запрашивает одноразовый одноразовый номер [ограниченный по времени и сгенерированный случайным образом]
- Приложение хеширует пароль пользователя: [используя одноразовый номер в процессе]
sha1(sha1([password]) + [nonce])
Приложение отправляет запрос аутентификации с именем пользователя, хешированным проходом и хэшированным одноразовым номером, чтобы получить токен JWT.
Веб-сервер проверяет одноразовый номер, а затем предоставленный пароль на основе предоставленного имени пользователя и в случае успеха отправляет токен клиенту, чтобы он мог использовать другие конечные точки.
[resquestHashedPassword] == sha1([dbHashedPassword] + [nonce])
- Клиент продолжает работать с другими частями службы, используя предоставленный JWT.
Есть ли способ, которым я могу сохранить пароль пользователя в безопасности, имея возможность использовать хэш-соль в хранилище данных на стороне сервера?
В двух словах, это вопрос о том, как использовать как "Nonce", как часть аутентификации запросы и "Salt" для хранения паролей.
* ИЗМЕНИТЬ 1 *
Просто добавлю некоторые уточнения:
Я знаю, что мы можем использовать HTTPS для шифрования передаваемых данных (и мы это делаем), однако HTTPS не является непроницаемым. Так что это не реальный ответ на вопрос.
Я не пытаюсь сделать свою собственную криптовалюту. Я просто пытаюсь использовать другие четко определенные решения, такие как отправка одноразового номера и сохранение соли рядом с паролем. Однако я не могу найти способ сделать оба.
Я знаю о других формах нападения. Однако вопрос касается безопасности пароля пользователя, а не безопасности приложения/службы. Если мне не нужен пароль в открытом виде, зачем мне отправлять его по сети? Безопасность сети — это еще одна проблема, которой этот вопрос не касается.
SHA1
это только пример.
* ИЗМЕНИТЬ 2 *
Что вы думаете об использовании имени пользователя (в нашем случае это его номер телефона, то есть 10 цифр, а 4 из них на самом деле не случайны) в качестве соли? У него, конечно, очень маленькая энтропия по сравнению со случайной солью, но это единственный способ, который я нашел до сих пор, который позволяет мне использовать оба метода. Или более безопасно полагаться на совершенство HTTPS и вместо этого вообще отказаться от идеи использования «Nonce» в хеш-функции?