Как работает аутентификация подписи API, реализованная в Mashery?
Mashery позволяет аутентификацию с помощью цифровой подписи следующим образом:
- Сначала объедините следующие компоненты:
- Ключ API
- Общий секрет
- UNIX Timestamp
- Затем создайте хэш MD5 для объединенной строки.
В документации говорится, что метка времени Unix требует точности +/- 5 минут. Подробности: http://support.mashery.com/docs/read/mashery_api/20/Authentication.
Предполагая, что это не коммерческая тайна, каков алгоритм для выполнения аутентификации, подобной этой?
В частности, как это возможно, когда метка времени Unix может меняться на 5 минут? Техника "грубой силы" может заключаться в том, чтобы вычислять сигнатуру для каждого возможного значения метки времени до нахождения соответствия (или нет), но это не кажется практичным для аутентификации частых вызовов API.
4 ответа
Да, похоже, это то, что он делает. Ссылка на документацию, которую вы указали, гласит: "По обе стороны от текущей метки времени на сервере Mashery допускается пятиминутное покачивание, чтобы обеспечить разумный сдвиг часов". Это означает, что им нужно проверить до 600 хэшей, чтобы убедиться, что представленный хэш действителен. 5 минут - 300 секунд. Плюс или минус делает 600 проверок.
Это кажется мне практичным. 600 MD5s - это не много обработки. На самом деле, современный валидатор паролей (например, тот, который использует bcrypt) будет выполнять гораздо больше работы для проверки пароля.
Amazon приводит хороший пример подписания запроса и во многих деталях, которые должны сделать механику очевидной (я понимаю, что это не пустяк - но я думаю, что это то, что вам нужно, или, по крайней мере, поможет в вашем путешествии к счастью безопасности API)
http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?RESTAuthentication.html
sha256 довольно быстрый. Даже в php вы можете вычислить 830K sha256 в секунду, так что они, скорее всего, просто переборщили.
<?php
$COUNT = 6000000;
$start = microtime(true);
for($i = 0; $i < $COUNT; $i++) {
$out = hash('sha256', 'wefjklwfekjlewfjklwefjklfwejkwefjklwfekjl' . $i);
//print("$out\n");
}
$total = microtime(true) - $start;
print("Time: $total\n");
print("sha256's per second: " . ($COUNT / $total) . "\n");
?>
Mashery также может предварительно сгенерировать список действительных подписей или кэшировать каждый сиг по требованию. Подпись является глобальной для всех API, которые Mashery защищает для этого API Key / Shared Secret, поэтому нет необходимости проверять вызов API уникально для каждого запроса.