2015-09-22 20 views
0

Я разрабатываю REST webService, и некоторые из моих клиентов будут использовать мои веб-сервисы, поэтому для идентификации подлинного клиента я решил предоставить им уникальный токен приложения для каждого подлинного клиента. Клиент будет кодировать этот токен, и они помещают этот токен в заголовок запроса, и я настраиваю фильтр REST в своих веб-службах REST для проверки Token. Я не хочу использовать https. Моя проблема в том, что любой может взять этот токен со своего клиентского сайта и может использовать мои сервисы REST. Как я могу это остановить?Безопасность и аутентификация JAX-RS

+4

В чем причина отказа от использования https? – user2953113

ответ

1

Поскольку вы не хотите использовать https, я полагаю, что конфиденциальность здесь не проблема, и вы только хотите разрешить запросы, основанные на том, кто их создает. Вместо того, чтобы передавать простой токен, который можно украсть, вы должны попросить своих клиентов подписать их запросы. У вас есть хорошее объяснение здесь:

Короче говоря, и взяты из Implementing HMAC authentication for REST API with Spring Security:

  1. клиента и сервера доли секрет доступа ключ и ключ открытого доступа.
  2. Клиент создает запрос, содержащий три основных элемента: заголовок открытого ключа (в виде простого текста), заголовок даты, строку подписи, вычисленную хэшированием некоторых данных запроса с помощью секретного ключа доступа. Этот хэш обычно содержит метод http, путь uri, значение заголовка даты (для ответных атак), весь контент запроса (для методов POST и PUT) и тип содержимого.
  3. Клиент отправляет запрос на сервер.
  4. Сервер считывает заголовок открытого ключа и использует его для получения соответствующего закрытого ключа доступа.
  5. Сервер использует секретный ключ доступа, чтобы вычислить подпись так же, как это сделал клиент.
  6. Сервер проверяет, совпадает ли только что вычисленная подпись с адресом, отправленным клиентом.
  7. (НЕОБЯЗАТЕЛЬНО) Во избежание ответных атак сервер проверяет, что значение в заголовке даты находится в пределах допустимого предела (обычно от 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 (или любую другую ошибку, которую вы хотите).


Там нет, то больше нет «секретов», чтобы украсть для потенциального человека в середине, но все еще есть ключи, которые должны быть надежно храниться на обоих клиентах и ​​сервере. Утечка этих ключей приведет к компрометации всей системы.

+0

Весна используется только в качестве примера и может быть опущена. Вы можете реализовать эту логику на любом языке программирования. –

+0

, если кто-то копирует все три основных элемента, как сказано в шаге 2, и они могут помещать эти детали в заголовок, а затем отправлять запрос, в этом случае что произойдет? –

0

Поскольку токен не может быть надежно передан по HTTP-уровню, можно легко получить этот токен. Вы можете попросить подлинного клиента зашифровать этот токен, объединив некоторую логику с меткой времени, чтобы каждый токен был зашифрован с использованием какого-то другого алгоритма, и на стороне сервера вы должны следовать аналогичному алгоритму для его расшифровки. Таким образом, даже если кто-то получит токен, который нельзя использовать повторно. Одним из способов является объединение этой логики шифрования с помощью Google Authenticator. (http://www.techrepublic.com/blog/google-in-the-enterprise/use-google-authenticator-to-securely-login-to-non-google-sites/)

0

Используйте контрольную сумму для обеспечения сообщения, как показано ниже

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. 
Смежные вопросы