Я разрабатываю REST webService, и некоторые из моих клиентов будут использовать мои веб-сервисы, поэтому для идентификации подлинного клиента я решил предоставить им уникальный токен приложения для каждого подлинного клиента. Клиент будет кодировать этот токен, и они помещают этот токен в заголовок запроса, и я настраиваю фильтр REST в своих веб-службах REST для проверки Token. Я не хочу использовать https. Моя проблема в том, что любой может взять этот токен со своего клиентского сайта и может использовать мои сервисы REST. Как я могу это остановить?Безопасность и аутентификация JAX-RS
ответ
Поскольку вы не хотите использовать https, я полагаю, что конфиденциальность здесь не проблема, и вы только хотите разрешить запросы, основанные на том, кто их создает. Вместо того, чтобы передавать простой токен, который можно украсть, вы должны попросить своих клиентов подписать их запросы. У вас есть хорошее объяснение здесь:
- Implementing HMAC authentication for REST API with Spring Security
- Using HMAC to authenticate Web service requests
- websec.io - API Authentication
Короче говоря, и взяты из Implementing HMAC authentication for REST API with Spring Security:
- клиента и сервера доли секрет доступа ключ и ключ открытого доступа.
- Клиент создает запрос, содержащий три основных элемента: заголовок открытого ключа (в виде простого текста), заголовок даты, строку подписи, вычисленную хэшированием некоторых данных запроса с помощью секретного ключа доступа. Этот хэш обычно содержит метод http, путь uri, значение заголовка даты (для ответных атак), весь контент запроса (для методов POST и PUT) и тип содержимого.
- Клиент отправляет запрос на сервер.
- Сервер считывает заголовок открытого ключа и использует его для получения соответствующего закрытого ключа доступа.
- Сервер использует секретный ключ доступа, чтобы вычислить подпись так же, как это сделал клиент.
- Сервер проверяет, совпадает ли только что вычисленная подпись с адресом, отправленным клиентом.
- (НЕОБЯЗАТЕЛЬНО) Во избежание ответных атак сервер проверяет, что значение в заголовке даты находится в пределах допустимого предела (обычно от 5 до 15 минут до расчёта расхождений). Злоумышленник не может манипулировать этим значением, поскольку он используется как часть подписи. Если кто-то изменит заголовок даты, сервер рассчитает другую сигнатуру, рассчитанную клиентом, так что шаг 6 завершится неудачно.
Эта логика может быть реализована с использованием любого языка программирования. Ниже псевдокод Пример подписи в Java:
//clientId is the public client identifier
//secretKey is the key shared between server and client
//requestContent is a string representation of the HTTP request (HTTP verb, body, etc.
//init signing key and mac
SecretKeySpec signingKey = new SecretKeySpec(secretKey.getBytes(), "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(signingKey);
//sign the request content
byte[] rawHmac = mac.doFinal(requestContent.getBytes());
//encode to base64
String result = base64(rawHmac);
//store in header
request.setHeader("Authorization", "MyAPI " + clientId + ":" + result);
На стороне сервера, когда вы получаете этот запрос, вы извлекаете ClientId и подпись из заголовка, получить секретный ключ, соответствующий ClientId получил , перекомпилируйте подпись (точно так же, как указано выше) и сравните результаты. Он соответствует клиенту, разрешен, если вы не возвращаете HTTP 403 (или любую другую ошибку, которую вы хотите).
Там нет, то больше нет «секретов», чтобы украсть для потенциального человека в середине, но все еще есть ключи, которые должны быть надежно храниться на обоих клиентах и сервере. Утечка этих ключей приведет к компрометации всей системы.
Весна используется только в качестве примера и может быть опущена. Вы можете реализовать эту логику на любом языке программирования. –
, если кто-то копирует все три основных элемента, как сказано в шаге 2, и они могут помещать эти детали в заголовок, а затем отправлять запрос, в этом случае что произойдет? –
Поскольку токен не может быть надежно передан по HTTP-уровню, можно легко получить этот токен. Вы можете попросить подлинного клиента зашифровать этот токен, объединив некоторую логику с меткой времени, чтобы каждый токен был зашифрован с использованием какого-то другого алгоритма, и на стороне сервера вы должны следовать аналогичному алгоритму для его расшифровки. Таким образом, даже если кто-то получит токен, который нельзя использовать повторно. Одним из способов является объединение этой логики шифрования с помощью Google Authenticator. (http://www.techrepublic.com/blog/google-in-the-enterprise/use-google-authenticator-to-securely-login-to-non-google-sites/)
Используйте контрольную сумму для обеспечения сообщения, как показано ниже
MD5 или SHA1 контрольная сумма должен быть использована для проверки пароля без прохождения фактического пароля.
The server sends a random string to the client.
The client appends his password to the random string, and returns an MD5/SHA1 sum of the result to the server.
On the server, do the same and compare the MD5/SHA1 sums.
If both MD5/SHA1 are identicals then the password is good and message is not changed.
- 1. Безопасность и аутентификация Kafka
- 2. Аутентификация и безопасность форм
- 3. Контейнерная управляемая безопасность, безопасность и аутентификация весов
- 4. Регистрация Symfony Безопасность и аутентификация
- 5. ASP.Net WebApi Аутентификация и безопасность
- 6. Аутентификация и безопасность в Hadoop
- 7. RabbitMQ - безопасность/аутентификация
- 8. Безопасность LogiXML - базовая аутентификация
- 9. Facebook oAuth Аутентификация Безопасность
- 10. Многопользовательская аутентификация/безопасность IPython
- 11. Форма Аутентификация Безопасность
- 12. Авто-аутентификация весной Безопасность
- 13. Безопасность, аутентификация и авторизация ASP.NET MVC4
- 14. Угловая с пружиной Безопасность Вход и аутентификация
- 15. Django удаленная аутентификация пользователя и безопасность
- 16. Весенняя безопасность и пользовательская внешняя аутентификация
- 17. gRPC и OAuth2 Аутентификация с весной Безопасность
- 18. Безопасность и аутентификация в веб-сервисах
- 19. Весна Безопасность и весна Социальная внешняя аутентификация
- 20. Безопасность веб-приложений и аутентификация клиента
- 21. JWT, аутентификация без сохранения и безопасность
- 22. веб-приложений Войти Аутентификация и безопасность Выпуск
- 23. пружинная безопасность 2-фазная аутентификация
- 24. весна безопасность запомнить меня аутентификация
- 25. Весенняя безопасность с Hibernate и аннотациями и базовая HTTP-аутентификация
- 26. Весенняя безопасность: почему аутентификация распространяется на Принципала?
- 27. Пользовательская аутентификация, связанная с безопасностью Весна Безопасность
- 28. Весенняя безопасность Обычная аутентификация с авторизацией Token
- 29. Весна Безопасность Основная аутентификация всегда вызывает 404
- 30. Аутентификация LDAP с использованием UnboundID: какая безопасность?
В чем причина отказа от использования https? – user2953113