Ho provato a riprodurre un oracolo di confronto delle stringhe in due lingue (Java e Python), ma non vedo alcuna correlazione nei tempi basata sull'input nel confronto. Ci sono degli esempi là fuori, o vedi un problema con il mio codice? Nota che vorrei qualcosa di semplice, come l'esempio che ho dato. Un attacco a un grande programma "in the wild" non è un buon esempio.
Inoltre, non sono stato in grado di trovare esempi di attacchi temporali semplici e pronti per l'esecuzione. Credo di aver disabilitato l'ottimizzazione di Java con -Djava.compiler = NONE. È necessario molto tempo per eseguire il codice, quindi chiaramente non sta completamente ottimizzando il codice.
Sembra strano che si parli spesso di questo, ma non ci sono esempi reali facilmente reperibili là fuori.
Ecco il mio codice Java così com'è oggi. L'output varia un po 'a caso senza apparentemente correlazione che ho identificato. Ho aggiunto alcune note all'output in modo da poter vedere quali dovrebbero essere i confronti più lenti.
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);
}
}
Output (nota che il primo confronto è sempre lento, all'avvio del programma):
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