He intentado reproducir un oráculo de tiempo de comparación de cadenas en dos idiomas (Java y Python), pero no veo ninguna correlación en el tiempo en función de la entrada en la comparación. ¿Hay algún ejemplo por ahí, o ves algún problema con mi código? Tenga en cuenta que me gustaría algo simple, como el ejemplo que he dado. Un ataque a un programa grande "en la naturaleza" no es un buen ejemplo.
Tampoco he podido encontrar ejemplos simples y listos para ejecutar de ataques de tiempo. Creo que he deshabilitado la optimización de Java con -Djava.compiler = NINGUNO. Se necesita una cantidad de tiempo considerable para ejecutar el código, por lo que claramente no está optimizando completamente el código.
Parece extraño que se haya hablado con frecuencia sobre esto, pero no hay ejemplos reales que se puedan encontrar fácilmente.
Aquí está mi código Java tal como está hoy. La salida varía un poco aleatoriamente sin aparentemente una correlación que haya identificado. He agregado algunas notas a la salida para que pueda ver cuáles deberían ser comparaciones más lentas.
public class TimingAttackJavaTest {
public static void main(String[] args) {
TimeCompare("a0", "b0", "a, b ");
TimeCompare("aaaaaaaaaa1", "bbbbbbbbbbb1", "a*10, b*10");
TimeCompare("aaaaaaaaaa10", "bbbbbbbbbbb10", "a*10, b*10");
TimeCompare("aaaaaaaaaa2", "b2", "a*10, b ");
TimeCompare("a3", "bbbbbbbbbbb3", "a, b*10 ");
TimeCompare("aaaaaaaaaa4", "bbbbbbbbbbb4", "a*10, b*10 ");
TimeCompare("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1", "a*100, a*100");
TimeCompare("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1", "a*100, a*100");
TimeCompare("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2", "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "a*100, b*100");
TimeCompare("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2", "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "a*100, b*100");
TimeCompare("a", "a", "a, a ");
TimeCompare("aaaaaaaaaaa", "aaaaaaaaaaa", "a*1, a*10 ");
TimeCompare("1aaaaaaaaaa10", "2bbbbbbbbbbb10", "a*10, b*10");
}
static void TimeCompare(String a, String b, String outputLabel)
{
boolean temp = false;
long startTime;
long endTime;
long duration;
startTime = System.nanoTime();
for(int i = 0; i < 10000000; i++)
{
temp = a.equals(b);
}
endTime = System.nanoTime();
duration = endTime - startTime;
System.out.println(outputLabel + temp + "\t\t" + duration);
}
}
Salida (tenga en cuenta que la primera comparación siempre es lenta, ya que el programa se inicia):
a, b false 930418800
a*10, b*10false 513034800
a*10, b*10false 510905300
a*10, b false 534267200
a, b*10 false 524720700
a*10, b*10 false 509250100
a*100, a*100false 516159000 **This should return slowly**
a*100, a*100false 508714700 **This should return slowly**
a*100, b*100false 511160700 **This should return quickly**
a*100, b*100false 522029800 **This should return quickly**
a, a true 278492700
a*1, a*10 true 284238900
a*10, b*10false 506245000