Вы можете угадать секретную строку, если вы можете ввести свои собственные строки для сравнения, или просто наблюдать, сколько строк (не выбранных вами) сравнивается с секретной строкой, , если сравнение строк было записано втаким образом, что время его выполнения раскрывает информацию о секретной строке .
Это известная уязвимость, которую может иметь криптографическое программное обеспечение, и все серьезные криптографические программы, написанные в настоящее время, избегают этой уязвимости.
Например, чтобы избежать раскрытия информации о своих аргументах, функция, которая проверяет,буферы одинаковы или могут быть записаны по-разному:
int crypto_memcmp(const char *s1, const char *s2, size_t n)
{
size_t i;
int answer;
for (i=0; i<n; i++)
answer = answer | (s1[i] != s2[i]);
return answer;
}
Вы можете использовать несколько методов, чтобы проверить, что часть кода не пропускает секреты посредством временных атак.Я написал, как это сделать со статическим анализом здесь , но это основано на предыдущей идее, которая использовала Valgrind (динамический анализ) здесь .
Обратите внимание, что это идет дальшечем это. Эта статья показала, что вам даже не нужно, чтобы путь выполнения зависел от секрета утечки информации.Достаточно было того, что секрет использовался для вычисления некоторых индексов массива, к которым впоследствии был получен доступ.На современных компьютерах это меняет время выполнения, поскольку кэш будет осуществлять два последовательных доступа к аналогичным индексам быстрее, чем два последовательных доступа к индексам, которые находятся далеко друг от друга, раскрывая информацию о секрете.