Я работаю над клиент-серверным приложением.Я соединил обе стороны через NIO, и их соединение защищено SSL.Теперь я хочу, чтобы сервер аутентифицировал учетные данные, которые пользователь ввел на стороне клиента.К сожалению, существует множество противоречивой информации.
Эта тема Можно ли отправлять простой текстовый пароль через HTTPS? утверждает, что
Этостандартная практика отправки «незашифрованных» паролей через HTTPS.
, что заставляет меня думать, что и в моем случае все должно быть в порядке.
Другие скажем
Как правило, вы хотите использовать протокол вызова / ответа
Я хочу, чтобы приложение было безопаснымкак это может быть.Соединение уже защищено TLS 1.2 и SSL, но, насколько я понимаю, это не делает невозможными атаки типа «посередине», что заставляет меня захотеть реализовать проверку подлинности по запросу.Но это вступает в противоречие с другой мерой безопасности на стороне сервера, которую я запланировал: salting .
Вот что я мог бы представить, что протокол, который включает в себя запрос-ответ и соление, должен быть:
- клиент отправляет имя пользователя
- сервер отвечает случайным вызовом и соль пользователя
- клиент хеширует пароль и соль, затем снова хэширует его с запросом и отправляет объединенный хэшсервер
- сервер извлекает из базы данных правильный хэш пароля, хэширует его с помощью запроса и проверяет результат по хешу, отправленному клиентом
У меня две проблемы с этим протоколом.
- Он отправляет клиентам соль пользователя, прежде чем пароль будет проверен.Я знаю, что соль не является секретом, но она по-прежнему кажется неправильной.
- Кто-то может взломать клиент, и использование этого протокола позволит ему проверить, существуют ли пользователи, и получить соль любого пользователя.
РЕДАКТИРОВАТЬ:
Проблема 2. может быть решена, если сервер ответит случайной солью в случае, если пользователь не существует, как указал Патрик Мевзекв комментариях.Таким образом, даже взломанный клиент не узнает, было ли неверное имя пользователя или пароль.