Приложение (клиент) может хешировать пароль два раза . Обратите внимание, что сервер должен генерировать другую случайную соль, а не клиент! В противном случае злоумышленник также может войти с этим хешем. Вы также можете сделать его более безопасным , сохранив в базе данных специальную соль для пароля.
Протокол:
0) серверы извлекают salt
для этого конкретного пароля из базы данных, генерируют salt2 и отправляют оба клиенту
1) клиент отправляет hash(hash(password, salt), salt2, timestamp)
и timestamp
.
2) сервер извлекает hash(password, salt)
из базы данных и сравнивает.
Обратите внимание, что если вы находитесь в сети, где злоумышленники могут не только прослушивать, но и изменять трафик , как Пауло указал , вы должны подписывать КАЖДОЕ сообщение : hash(hash(password, salt), salt2, timestamp, message)
и проверьте это на сервере. (Например, для случая, когда злоумышленник может изменить сообщение, чтобы оно содержало команду удаления ...)
Обратите внимание, что по-прежнему существует проблема , когда пользователю необходимо безопасно УСТАНОВИТЬ / ИЗМЕНИТЬ пароль . Вы не можете сделать это безопасно, просто используя хэш-функцию в небезопасной сети, вам нужен какой-то шифр / расшифровщик.
Также обратите внимание, что чем медленнее хэш-функция, тем безопаснее (из-за атаки по словарю). Если у вас нет доступа к специальной функции медленного хеширования, вы также можете вызвать обычную функцию быстрого хеширования 100000 раз.