Я пытаюсь произвести атаку по времени на PHP и использую PHP 7.1 со следующим скриптом:
<?php
$find = "hello";
$length = array_combine(range(1, 10), array_fill(1, 10, 0));
for ($i = 0; $i < 1000000; $i++) {
for ($j = 1; $j <= 10; $j++) {
$testValue = str_repeat('a', $j);
$start = microtime(true);
if ($find === $testValue) {
// Do nothing
}
$end = microtime(true);
$length[$j] += $end - $start;
}
}
arsort($length);
$length = key($length);
var_dump($length . " found");
$found = '';
$alphabet = array_combine(range('a', 'z'), array_fill(1, 26, 0));
for ($len = 0; $len < $length; $len++) {
$currentIteration = $alphabet;
$filler = str_repeat('a', $length - $len - 1);
for ($i = 0; $i < 1000000; $i++) {
foreach ($currentIteration as $letter => $time) {
$testValue = $found . $letter . $filler;
$start = microtime(true);
if ($find === $testValue) {
// Do nothing
}
$end = microtime(true);
$currentIteration[$letter] += $end - $start;
}
}
arsort($currentIteration);
$found .= key($currentIteration);
}
var_dump($found);
Это поиск слова со следующими ограничениями
- только от А до Я
- до 10 символов
Сценарий находит длину слова без каких-либо проблем, но значение слова никогда не возвращается, как ожидалось, при атаке по времени.
Есть ли что-то, что я делаю неправильно?
Скрипт перебирает длины, правильно определяет длину. Затем он перебирает каждую букву (a-z) и проверяет их скорость. Теоретически «хаааа» должно быть немного медленнее, чем «ааааа», потому что первая буква — «h». Затем он продолжается для каждой из пяти букв.
Бег дает что-то вроде «брха», что явно неправильно (каждый раз по-разному, но всегда неправильно).
1000000
? - person Martin   schedule 14.01.2018$found .= key($currentIteration);
после упорядочения массива по наибольшему времени. Реализация повторяется буква за буквой. php.net/manual/en/function.hash-equals.php следует использовать для атаки по времени ту же версию (вместо ===) - person exussum   schedule 14.01.2018===
всегда небезопасен для атаки по времени. Я почти уверен, что при определенных обстоятельствах===
может безопасно атаковать по времени, и вы можете столкнуться с этими обстоятельствами во втором цикле. - person apokryfos   schedule 14.01.2018$find = $argv[1];
, и дважды запустил это в командной строке:for s in hello marcell stack overflow; do php php-timing-attack.php $s; done
. Я получил следующие результаты:string(7) "9 found"
иstring(9) "zgmdykrbk"
,string(7) "7 found"
иstring(7) "marcell"
,string(7) "5 found"
иstring(5) "stack"
,string(7) "5 found"
иstring(5) "uusov"
(1-е место). - person marcell   schedule 15.01.2018string(7) "5 found"
иstring(5) "hello"
,string(7) "7 found"
иstring(7) "marcell"
,string(7) "5 found"
иstring(5) "stack"
,string(7) "8 found"
иstring(8) "overflow"
б>. - person marcell   schedule 15.01.2018$find = "hello";
на$find = $argv[1];
. Вот доказательство: хэш md5 исходного файлаa75273828aee0c34668faa592c0a76ca
и после указанной модификации:ecf5b5e18fab444fa7748cc8379dfbce
. Я наmacOs Sierra 10.12.6
, php:PHP 7.0.26 (cli)
. Вам нужна другая информация? - person marcell   schedule 15.01.2018