Чтобы было ясно, единственный РЕАЛЬНЫЙ способ сделать это - через HTTPS.
Но, поскольку я предполагаю, что это не вариант, и я также предполагаю, что вы ищете систему «полностью управляемого входа в систему», я продолжаю:
Помимо HTTPS, можно использовать JavaScript для безопасного хеширования паролей на стороне клиента, чтобы предотвратить явное обнаружение паролей в виде простого текста, но это только половина раствора.
Проблемы с этим подходом:
- Атака воспроизведения все еще возможна.
- Только пользователи с включенным JavaScript смогут авторизоваться таким образом.
Другой подход - более сложный механизм «вызов / ответ»:
- Отправьте "Challenge" вместе со страницей входа.
- Рассчитать хеш стороны пароля + вызова клиента.
- Введите логин.
- Рассчитайте хэш пароля + запроса (которому НЕ ДОЛЖЕН доверять запрос страницы) на стороне сервера и сравните.
И проблемы с этим:
- Только пользователи с включенным JavaScript смогут авторизоваться таким образом.
- Пароль PLAINTEXT должен храниться на сервере для проверки ответа на запрос и должен быть зашифрован на диске или защищен иным образом.
Теперь, чтобы быть справедливым, проблема № 2 не так опасна, как кажется. Фактически, когда вы вместо этого используете аутентификацию HASH, сам хэш поднимается до уровня «ключа».
На этом этапе довольно безопасно использовать cookie для хранения случайно сгенерированного логина ReferrenceID, аналогичного их идентификатору сеанса, но сервер может захотеть зашифровать с использованием ссылающегося IP как части IV или KEY, чтобы другие пользователи не могли захватить ReferrenceID.
В любом случае, я надеюсь, что это немного определит направление вашего дизайна.