Если кто-то использует сниффер HTTP для перехвата этой команды (которая будет подписана должным образом), как я могу дополнительно защитить связь, чтобы гарантировать, что клиент обрабатывает только команды, поступающие с нашего сервера?
Короче, ты не можешь.Если кто-то сможет прослушивать сетевой трафик, он сможет получить все, что вы отправите.Поэтому, если вы предварительно не поделитесь секретным ключом с помощью внешнего механизма (например, телефонного звонка), вы не сможете сделать это надежно.Если вы предварительно поделитесь секретом, то все, что вам нужно для этого:
Сервер:
$message = 'foomessage';
$message .= ':' . hash_hmac('md5', $message, $sharedSecret);
Клиент:
list ($message, $hmac) = explode(':', $message, 2);
if ($hmac != hash_hmac('md5', $message, $sharedSecret)) {
die('invalid signature');
}
Обратите внимание, что это 100%зависит от общего ключа.Если кто-то еще завладеет им, все ваши подписанные сообщения будут подделаны.
Еще один возможный способ обнаружения атаки в стиле сниффера - это использование подхода с синхронизацией.По сути, вы храните номер на сервере и на клиенте.При каждом запросе вы увеличиваете оба числа.Затем вы включаете это число в расчет hmac.Поскольку клиент и сервер общаются друг с другом, оба счета всегда должны быть синхронизированы.Но если они отключены, вы знаете, что произошел какой-то сбой связи, или кто-то ввел команду (угнали) с неправильным счетом.Таким образом, хотя он не будет «предотвращать» атаку повторного воспроизведения напрямую, он сделает его НАМНОГО сложнее, поскольку злоумышленнику потребуется отслеживать каждый отдельный HTTP-запрос между сервером и клиентом.
Но суть в том,заключается в том, что любой, кто скомпрометировал сеть, чтобы осуществить атаку MITM, сможет обойти практически все, что вы можете на них бросить ... Лучший способ обезопасить себя от нее - это предварительно поделиться секретными ключами во внеполосной сети.поместье (такое, что сканер HTTP не сможет обнаружить общий ключ).Затем просто отправьте любое сообщение с этим общим ключом.