Использование HTTPS для связи клиент-сервер - PullRequest
4 голосов
/ 06 октября 2010

Я хотел бы использовать HTTPS для защиты связи между моим клиентом и сервером. Первое зашифрованное сообщение будет использоваться для аутентификации пользователя, то есть проверки его / ее имени пользователя и пароля.

После того, как учетные данные пользователя будут успешно проверены сервером, я хотел бы начать получать некоторые данные в последующих запросах. НО как сервер определит, что последующий запрос отправляется пользователем, чьи учетные данные уже проверены?

Поскольку соединение TCP может быть закрыто между входом в систему и последующими запросами HTTPS, (я думаю) это означает, что контекст SSL должен быть освобожден сервером, поэтому с новым запросом GET должно быть установлено новое соединение TCP и Необходимо выполнить новое рукопожатие SSL (TLS) (т. е. обе стороны должны обменять новый общий пароль для шифрования и т. д.)

Для этого я думаю, что серверу нужно отправить обратно клиенту ответ 200 OK для первоначального запроса аутентификации некоторого случайно сгенерированного одноразового номера (который действителен в течение определенного времени), который я буду включать в каждый последующий запрос, поэтому сервер сможет определить, на основе этого случайно сгенерированного одноразового номера, какое имя пользователя находится за запросом, и проверить, что этот пользователь уже вошел в систему. Мое понимание верно?

Большое спасибо за ответ BR Sten

Ответы [ 2 ]

2 голосов
/ 06 октября 2010

Самый простой метод - требовать, чтобы все коммуникации проходили по HTTPS (чтобы данные были конфиденциальными; никто, кроме клиента и сервера их не видел), и использовал простое имя пользователя и пароль при каждом запросе внутри этого защищенного соединения. Это очень просто сделать на практике (имя пользователя и пароль фактически передаются по соединению в виде HTTP-заголовка, что здесь нормально, потому что мы используем HTTPS), и сервер может проверять каждый раз , что пользователь позволено. Вам не нужно беспокоиться о рукопожатиях SSL; Это ответственность уровня SSL / HTTPS (и именно поэтому HTTPS / SSL хороший ).

В качестве альтернативы, вход в систему может быть выполнен любым методом и генерировать некое магическое число (например, UUID или криптографический хэш случайного числа и имени пользователя), которое хранится в файле cookie сеанса. Последующие запросы могут просто проверить, является ли магический номер тем, который он распознает с начала сеанса (и что с момента его выдачи прошло не так много времени); Выход из системы просто забывает о магическом числе на стороне сервера (и просит клиента забыть тоже). Это немного сложнее для реализации этого, но все еще не сложно, и есть серверные библиотеки для обработки осла.

Первый вариант особенно хорош для случаев, когда вы пишете что-то, что будет использоваться другими программами, поскольку его действительно легко реализовать. Второй вариант лучше, когда клиент является веб-браузером, так как он дает пользователям больший контроль над тем, когда их браузер авторизован (программные API не склонны к таким вещам). Когда клиент будет браузером, вам нужно позаботиться о защите от других типов атак (например, различных типов подделки запросов), но это в значительной степени не зависит от всего остального.

0 голосов
/ 06 октября 2010

Изобретать пользовательский механизм аутентификации в вашем случае очень рискованно - легко ошибиться, что позволит совершить множество неправильных действий. Поэтому правильным подходом, как по мне, было бы использование HTTPS и передача учетных данных пользователя при каждом запросе.

...