2016-07-26 4 views
8

Я полный noob, когда дело доходит до безопасности, стратегий аутентификации. Так что я читал эту статью о «Проверка подлинности на основе маркеров»: https://scotch.io/tutorials/the-ins-and-outs-of-token-based-authenticationJWT & OAuth2 - хранит ли сервер токен? & Как они безопасны/безопасны для хакеров?

У меня 2 вопроса:

  1. я не понимаю, почему посредник (или хакер) не смог бы увидеть токен, отправленный клиентом, и использовать его для выдачи себя за этого клиента/человека для извлечения ресурсов? Что делает аутентификацию JSON Web Tokens/OAuth2 более безопасной в этом смысле? Если мы каждый раз используем токен, используемый только для использования, я бы понял, что даже если хакер может прочитать токен, он не сможет использовать его для другого запроса. Но поскольку токен остается прежним до истечения срока его действия, как это безопасная стратегия аутентификации?

  2. Как сервер знает, что маркер, отправленный клиентом, действителен, то есть что-то, что сервер обменивал с клиентом во время входа в систему. Хранит ли сервер токен, сгенерированный в базе данных или где-то, и продолжает обновлять «последнюю доступную временную метку» или что-то еще и продолжает удалять токены, где last_accessed_time> 1 час назад, чтобы продолжать истекать через 1 час бездействия?

ответ

15

Я не понимаю, почему посредник (или хакер) не смог бы увидеть маркер, отправленный клиентом, и использовать его для олицетворения в качестве этого клиента/человека для извлечения ресурсов?

JWT не защищает вас от нападения «человек-в-середине» (MITM). Если злоумышленник получает действительный токен, он может эффективно выдавать себя за него. Даже если содержимое зашифровано.

JWT следует использовать с/TLS соединения SSL, чтобы избежать MITM

Что делает аутентификации на основе JSON Web токены/OAuth2 безопаснее в этом смысле?

JWT - это формат токена, а oauth2 - протокол. oauth2 может использовать jwt. Oauth2 более безопасен для пользователя с использованием стороннего сайта, поскольку учетные данные отправляются только от пользователя на главный сайт, а затем сайт выдает токен, который может использоваться сторонним сайтом для аутентификации пользователя. Сайт третьей стороны никогда не видит учетных данных пользователя

Но поскольку токен остается неизменным до истечения срока его действия, как это безопасная стратегия аутентификации?

Читайте выше. Вам нужно защитить свои жетоны, чтобы их не украли: в основном используйте HTTPS или смягчайте его эффекты: храните в файлах cookie с HttpOnly (если вам не нужно получать доступ к содержимому JWT на стороне клиента), установите время истечения срока действия коротким, поверните маркеры ...

Как известно серверу, что токен, отправленный клиентом, является действительным, то есть то, что сервер обменивал с клиентом во время входа в систему.

Третья часть JWT как hhhh.pppp.ssss является подписью. Подпись выполняется с закрытым ключом сервера по заголовку и полезной нагрузке (hhhh.pppp), защищает содержимое. Если злоумышленник изменяет содержимое или подпись, сервер будет обнаруживать его, проверяя подпись и отклоняя аутентификацию.

ли хранилище сервера маркер, генерируемого в базе данных или где-то и постоянно обновлять «последнего доступа метки времени» или что-то и держит удаление маркеров где last_accessed_time является> 1час назад, чтобы сохранить истекающий его через 1 час бездействия ?

Не требуется. Подпись упакована в сам токен (ssss), поэтому сказано, что JWT является автономным.

Сервер имеет криптографический секретный ключ или пару ключей, общедоступный и приватный. Токен подписан и проверен секретным ключом (для симметричных ключей HMAC) или подписан с закрытым ключом и проверен с помощью соответствующего открытого ключа (для асимметричных ключей RSA)

+0

Удивительные объяснения. – user1102532

+0

Я смог реализовать это, и он хорошо работает, но есть еще одна вещь, о которой я не уверен. Мы создаем токен и говорим, что мы установили его в течение 15 минут. Он истекает через 15 минут независимо от того, что нужно, и пользователь должен снова аутентифицироваться. Однако я хочу обновить этот токен до тех пор, пока пользователь активен и истекает его, только когда он/она становится неактивным в течение 15 минут. Как мы можем это сделать, поскольку токен хранится на стороне клиента, и даже если мы изменим временную метку истечения срока действия, расшифровав токен base64 и переведя его обратно, работать не будет. – user1102532

+1

Вы не можете изменить время истечения срока действия JWT, потому что оно сломает подпись, и сервер отклонит токен. Вы должны обновить токен, когда он близок к истечению срока действия. Например, при ответе на запрос сервер выдаст новый JWT и настроит настраиваемый заголовок в ответ. В качестве альтернативы выполните конкретный запрос AJAX от клиента, чтобы получить новый токен. – pedrofb

1

все дело в том, чтобы подписать токен. не шифруя токен. Сервер просто проверяет подпись. JWT не зашифрован (если вы его не реализуете). Не храните конфиденциальные данные в токене, потому что по умолчанию он не зашифрован.

+1

Является ли эта подпись изменена для каждого пользователя и для каждого другого логин того же пользователя? Если да, то где сервер хранит эти подписи, чтобы проверить, является ли входящий запрос действительным? – user1102532

+0

вы можете рассматривать подпись как зашифрованную контрольную сумму фактического токена. , конечно, каждый токен отличается, поэтому подпись отличается. сервер имеет только закрытый/открытый ключ, используемый для подписи маркера. При получении токена сервер просто подтверждает, что токен является подлинным, сопоставляя токен с сигнатурой. Человек в средней атаке (если не использует https) может изменить токен, но он не может знать ключи, используемые для подписывания токена, поэтому сервер будет идентифицировать токен как не подлинный, и не получится позвонить –

 Смежные вопросы

  • Нет связанных вопросов^_^