Я читал о ценных бумагах API и пытался найти лучший способ создания безопасного API. Я знаю, что OAuth и такие существуют, но я также пытаюсь воспитывать себя в этом процессе и не полагаться на библиотеки.Защита от повторных атак при использовании сигнатур запроса в защищенном API-интерфейсе?
В основном у меня есть веб-сервис, и в этом веб-сервисе пользователи могут зарегистрироваться для API. Им будет предоставлен идентификатор профиля и секретный ключ, который они должны использовать для создания запроса API из другой веб-системы.
запросAPI построен аналогично тому, как банки делают это, все входные данные, посылаемые API должен быть отсортирован, хеш вычисляется, а затем хэш отправляется на сервер, например:
// Profile data
$apiProfile='api123';
$apiSecret='this-is-a-good-day-to-be-a-secret-key';
// Input
$input=array();
$input['name']='Thomas Moore';
$input['profession']='Baker';
// To ensure that the order of variables checked and received is the same on both ends:
ksort($input);
// Using serialize() for simplifying things
// http_build_query() is another option, or just placing values in order
$input['hash']=sha1(serialize($input).$apiSecret);
// Making a request to URL:
// Using file_get_contents() as an example, would use cURL otherwise
$result=file_get_contents('http://www.example.com/api.php?'.http_build_query($input));
// SERVER CALCULATES COMPARISON HASH BASED ON KNOWN SECRET KEY AND INPUT DATA
Этот действительно хорош и работает. Но! Моя проблема - потенциальная атака повтора. Если кто-то удалит этот URL-адрес запроса, он может отправить его на сервер снова, даже если они не могут сами изменить данные.
Теперь я прочитал некоторые вещи об этом, что вы также должны либо проверить время, либо добавить одноразовый токен в запрос, но я не уверен, как именно я должен это делать? Отправляет ли отметка времени с достаточной надежностью? (Получающий сервер будет следить за тем, чтобы запрос возник за несколько секунд в течение времени, когда запрос был выполнен, если часы несколько синхронизированы).
Я мог бы также добавить проверки IP в микс, но они могут измениться и могут быть подделаны несколько, и это больше хлопот для пользователя.
Мне бы очень понравился этот одноразовый тип системы, но я не уверен, как это сделать, не выставляя генерацию токенов для той же самой проблемы с атакой повтора? (Последнее, что мне нужно, это дать возможность раздавать защитные жетоны для средних людей).
Мнения и статьи будут очень желанными, я не смог найти материал, который отвечает моим конкретным проблемам. Я хочу сказать, что мой API защищен, не говоря о том, что он просто говорит по-английски.
Спасибо!
Спасибо за вотум доверия. Я просто параноик-перфекционист, я полагаю. – kingmaple
Я мог бы использовать фактический HMAC, чтобы избежать атак с расширением длины, хотя похоже, что вы не уязвимы, так как вы помещаете секрет последним, а не первым. http://en.wikipedia.org/wiki/Hmac http://en.wikipedia.org/wiki/Length_extension_attack – alberge