Un'affermazione ampia come "questo è impossibile" è improbabile che sia accurata al 100%.
È vero che Java (e linguaggi simili come C # /. NET) gira con un compilatore JIT che produrrà gli opcode effettivi solo in fase di esecuzione, quindi la sequenza di opcode è più difficile da prevedere; potrebbe anche cambiare con la versione di implementazione della VM. Inoltre, il linguaggio ha un efficiente GC che promuove l'uso della memoria dinamica, e in particolare le stringhe immutabili, che offrono un molti comportamenti temporali dipendenti dai dati.
È ancora possibile scrivere codice immune agli attacchi temporali, in particolare per gli algoritmi crittografici. Devi solo evitare alcune delle buone proprietà di Java, e usarlo come se fosse una sorta di C. abbattuto. Lavora su matrici di byte
o char
, usa l'aritmetica piuttosto che i test ... (così non utilizzare boolean
). Ad esempio, questo codice di sincronizzazione del tempo confronta x
e y
e li scambia se x
è maggiore di y
:
int cc = (y - x) >> 31;
int tmpx = (cc & x) | (~cc & y);
int tmpy = (~cc & x) | (cc & y);
x = tmpy;
y = tmpx;
Potremmo notare che Java rende tale codice in realtà un po 'più facile da scrivere rispetto a C poiché, contrariamente a C, offre un comportamento fisso standard quando si sposta a destra un valore negativo.