В криптографии атака по времени - это атака по побочному каналу , в котором злоумышленник пытается взломать криптосистему, анализируя время, затрачиваемое на выполнение криптографических алгоритмов. Каждая логическая операция в компьютере требует времени для выполнения, и время может отличаться в зависимости от ввода; с точным измерением времени для каждой операции злоумышленник может работать в обратном направлении до входа. Поиск секретов с помощью информации о времени может быть значительно проще, чем использование криптоанализа известных пар открытого текста и зашифрованного текста. Иногда информация о времени комбинируется с криптоанализом для увеличения скорости утечки информации.
Информация может просочиться из системы путем измерения времени, необходимого для ответа на определенные запросы. Насколько эта информация может помочь злоумышленнику, зависит от многих переменных: дизайн криптографической системы, процессор, на котором работает система, используемые алгоритмы, различные детали реализации, меры противодействия атакам по времени, точность измерений времени и т. Д. Атаки по времени могут применяться к любой алгоритм, который имеет вариацию времени в зависимости от данных. Удаление временных зависимостей затруднено в некоторых алгоритмах, использующих операции низкого уровня, которые часто демонстрируют различное время выполнения.
Временные атаки часто упускаются из виду на этапе проектирования, потому что они сильно зависят от реализации и могут быть непреднамеренно введены с помощью оптимизации компилятора. Избежание временных атак включает в себя разработку функций постоянного времени и тщательное тестирование окончательного исполняемого кода.
Многие криптографические алгоритмы могут быть реализованы (или замаскированы прокси-сервером) таким образом, чтобы уменьшить или исключить информацию о времени, зависящую от данных, алгоритм постоянного времени . Рассмотрим реализацию, в которой каждый вызов подпрограммы всегда возвращается ровно через x секунд, где x - максимальное время, которое когда-либо требовалось для выполнения этой подпрограммы для каждого возможного авторизованного ввода. В такой реализации время алгоритма не дает утечки информации о данных, предоставленных этому вызову. Обратной стороной этого подхода является то, что время, используемое для всех выполнений, становится временем наихудшего выполнения функции.
Зависимость синхронизации от данных может происходить из одного из следующих факторов:
Время выполнения квадратного Алгоритм и-умножения, используемый в модульном возведении в степень, линейно зависит от количества битов '1' в ключе. Хотя одного только числа битов «1» недостаточно, чтобы упростить поиск ключа, можно использовать повторные выполнения с одним и тем же ключом и разными входами для выполнения статистического корреляционного анализа информации о времени для полного восстановления ключа, даже если пассивный злоумышленник. Наблюдаемые измерения синхронизации часто включают шум (из таких источников, как задержка в сети или различия в доступе к диску, а также методы исправления ошибок, используемые для восстановления после ошибок передачи). Тем не менее, временные атаки применимы против ряда алгоритмов шифрования, включая RSA, ElGamal и Алгоритм цифровой подписи.
. В 2003 году Boneh и Брамли продемонстрировал практическую сетевую синхронизирующую атаку на веб-серверы с SSL, основанные на другой уязвимости, связанной с использованием RSA с китайской теоремой об остатках. оптимизации. Фактическое сетевое расстояние в их экспериментах было небольшим, но атака успешно восстановила закрытый ключ сервера за считанные часы. Эта демонстрация привела к широкому распространению и использованию методов ослепления в реализациях SSL. В этом контексте ослепление предназначено для устранения корреляции между ключом и временем шифрования.
Некоторые версии Unix используют относительно дорогостоящую реализацию функции библиотеки crypt для хеширования 8-значного пароля в строка из 11 символов. На более старом оборудовании это вычисление занимало преднамеренно и ощутимо много времени: в некоторых случаях до двух или трех секунд. Программа входа в систему в ранних версиях Unix выполняла функцию crypt только тогда, когда имя входа распознавалось системой. Эта утечка информации о сроках действия имени для входа, даже если пароль был неверным. Злоумышленник может воспользоваться такими утечками, применив сначала грубую силу для создания списка известных имен для входа в систему, а затем попытаться получить доступ, объединив только эти имена с большим набором паролей, которые, как известно, часто используются. используемый. Без какой-либо информации о допустимости имен для входа время, необходимое для выполнения такого подхода, увеличилось бы на порядки, что фактически сделало бы его бесполезным. Более поздние версии Unix исправили эту утечку, всегда выполняя функцию crypt, независимо от допустимости имени входа.
Два других безопасно изолированных процесса, работающих в одной системе с кэш-памятью или виртуальная память может обмениваться данными, умышленно вызывая сбои страниц и / или пропуски кеша в одном процессе, а затем отслеживая результирующие изменения времени доступа в другом. Аналогичным образом, если приложение является доверенным, но на его пейджинг / кэширование влияет логика ветвления, второе приложение может определить значения данных по сравнению с условием ветвления путем отслеживания изменений времени доступа; в крайних случаях это может позволить восстановить биты криптографического ключа.
Атаки Meltdown и Spectre 2017 года, вынудившие производителей процессоров (включая Intel, AMD, ARM и IBM), чтобы модернизировать свои процессоры, оба полагаются на атаки по времени. По состоянию на начало 2018 года почти каждая компьютерная система в мире подвержена воздействию Spectre, что делает его самым мощным примером временной атаки в истории.
Следующий C код демонстрирует типичное небезопасное сравнение строк, которое останавливает тестирование, как только символ не совпадает. Например, при сравнении «ABCDE» с «ABxDE» он вернется после 3 итераций цикла:
bool insecureStringCompare (const void * a, const void * b, size_t length) {const char * ca = a, * cb = б; for (size_t i = 0; i < length; i++) if (ca[i] != cb[i]) return false; return true; }
Для сравнения, следующая версия работает с постоянным временем, проверяя все символы и используя побитовую операцию для накопления результата:
bool constantTimeStringCompare (const void * a, const void * b, size_t length) {const char * ca = a, * cb = b; bool result = true; for (size_t i = 0; i < length; i++) result = ca[i] != cb[i]; return result; }
Атаки по времени легче монтировать, если злоумышленник знает внутреннее устройство аппаратной реализации и, тем более, используемую криптографическую систему. Поскольку криптографическая безопасность никогда не должна зависеть от скрытности того или другого (см. безопасность через скрытность, в частности, оба Максима Шеннона и принцип Керкхоффса ), устойчивость к атакам по времени тоже не должна. Если нет ничего другого, образец можно купить и реконструировать. Атаки по времени и другие атаки по побочным каналам также могут быть полезны для идентификации или возможно, обратное проектирование, криптографический алгоритм, используемый каким-либо устройством.
| quotes =
(); | access-date =
требуется | url =
()