2014-09-15 5 views
1

strcmp - что означает «Сравнение двоичной безопасной строки»? Это сравнение безопасно для временной атаки?Временная атака в PHP

Если нет, как я могу сравнить две строки для предотвращения временной атаки? Сравнение хэшей строк достаточно? Или я должен использовать некоторую библиотеку (или собственный код), которая дает постоянное время для сравнения?

Here пишет, что временная атака может использоваться в сети. Но может ли быть такой тип атаки в реальном мире? Или эта атака может использоваться только для небольшого типа злоумышленника (например, правительства), чтобы эта защита через Интернет была избыточной?

+1

Я думаю, что эти атаки являются реальными и могут быть выполнены, но для планирования атаки требуется много времени, найти нужные вам данные и т. Д. Я думаю, что большинство PHP-скриптов, или, может быть, у PHP есть ошибки, которые легче использовать, чем измерять 5 дней, чтобы получить целочисленное дешифрование.Но вы всегда должны сравнивать строки с '===', а не с '=='. – TiMESPLiNTER

+0

Мы пишем приложение, которое ловит обратный вызов из другого приложения и дает пользователю несколько монет. Этот URL-адрес может быть найден злоумышленником, чтобы он мог использовать этот URL-адрес для получения мошеннических монет. Эти монеты тогда могут быть сняты, поэтому 5 дней - это хороший сценарий для злоумышленника) В нашем приложении есть некоторая защита, но я не знаю, должен ли я использовать защиту от временной атаки или нет –

+0

Я думаю, что двоичный сейф не имеет никакого отношения к хронологии: http://en.wikipedia.org/wiki/Binary-safe – Kyborek

ответ

0

«двоичный сейф» означает, что любые байты можно безопасно сравнивать с strcmp, а не только действительными символами в некотором наборе символов. Быстрый тест подтверждает, что strcmp не защищены от атак синхронизации:

$nchars = 1000; 
$s1 = str_repeat('a', $nchars + 1); 
$s2 = str_repeat('a', $nchars) . 'b'; 
$s3 = 'b' . str_repeat('a', $nchars); 

$times = 100000; 

$start = microtime(true); 
for ($i = 0; $i < $times; $i++) { 
    strcmp($s1, $s2); 
} 
$timeForSameAtStart = microtime(true) - $start; 

$start = microtime(true); 
for ($i = 0; $i < $times; $i++) { 
    strcmp($s1, $s3); 
} 
$timeForSameAtEnd = microtime(true) - $start; 

printf("'b' at the end: %.4f\n'b' at the front: %.4f\n", $timeForSameAtStart, $timeForSameAtEnd); 

Для меня это печатает что-то вроде 'b' at the end: 0.0634 'b' at the front: 0.0287.

Многие другие строковые функции в PHP, вероятно, страдают от подобных проблем. Работа вокруг этого сложна, особенно на PHP, где вы фактически не знаете, что на самом деле выполняет множество функций на физическом уровне.

Одна из возможных тактик - это просто случайное время ожидания в коде, прежде чем вы вернете ответ вызывающему/потенциальному злоумышленнику. Еще лучше, измерьте, сколько времени потребовалось, чтобы проверить входные данные (например, с microtime), а затем дождаться случайного времени минус это количество времени. Это не на 100% безопасно, но делает атакующей систему намного сложнее, потому что, как минимум, злоумышленнику придется многократно проверять каждый вход, чтобы отфильтровать случайность.

+0

Для PHP 5.6 существует hash_equals(). Для всего остального существует '$ nonce = mcrypt_create_iv (32, MCRYPT_DEV_URANDOM); return hash_hmac ('sha256', $ calculate, $ nonce) === hash_hmac ('sha256', $ expected, $ nonce); ' –

0

Проблема с strcmp заключается в том, что это зависит от реализации. Если он двоично сравнивает каждый байт строк, пока не достигнет разницы или конца строк, тогда он уязвим для синхронизации времени.

Теперь как насчет хэширования?

Я нашел этот вопрос безопасности, и я верю, что есть правильный ответ для вас: https://security.stackexchange.com/a/46215

1

Timing атака является мифом.

Объясняю.

Время, затрачиваемое на проверку текста, между одним и тем же другим, составляет около секунды, скажем +/- 0,1 секунды (преувеличено!).

Тем не менее, время, которое требуется злоумышленник, чтобы измерить этот раз составляю:

задержки сети + 0,1 секунды + задержки системы (может быть ее занята какой-то другая задача) + другие задержки.

Нет, это невозможно, даже для локальной системы (лаг нуля), результат интервала времени всегда неясен.

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