Es poco probable que una declaración amplia como "esto es imposible" sea 100% precisa.
Es cierto que Java (y lenguajes similares como C # / .NET) se ejecuta con un compilador JIT eso producirá los códigos de operación reales solo en tiempo de ejecución, por lo que la secuencia de códigos de operación es más difícil de predecir; También puede cambiar con la versión de implementación de VM. Además, el lenguaje tiene un GC eficiente que promueve el uso de memoria dinámica, y en particular cadenas inmutables, que ofrecen una muchos de los comportamientos de tiempo dependientes de los datos.
Todavía es posible escribir código que sea inmune a los ataques de tiempo, en particular para algoritmos criptográficos. Solo debe rechazar algunas de las propiedades agradables de Java y usarlo como si fuera algún tipo de C. diluida. Trabajar en matrices de byte
o char
, usar aritmética en lugar de pruebas ... (así no utilice boolean
). Por ejemplo, este código inmune al tiempo compara x
y y
, y los intercambia si x
es mayor que y
:
int cc = (y - x) >> 31;
int tmpx = (cc & x) | (~cc & y);
int tmpy = (~cc & x) | (cc & y);
x = tmpy;
y = tmpx;
Es posible que notemos que Java hace que este código sea en realidad algo más fácil de escribir que C, ya que, al contrario de C, ofrece un comportamiento fijo estándar cuando se cambia a la derecha un valor negativo.