Manejo de contraseñas en wicket

0

Tengo un formulario que contiene un campo de contraseña.

En swing, el método getPassword () devuelve una matriz de caracteres. Después de que la contraseña haya sido procesada por mi aplicación web, se puede borrar la matriz para eliminar la contraseña de la memoria. Esto no es posible cuando se utilizan cadenas porque las cadenas son inmutables. El uso de matrices reduce el riesgo de ataques de divulgación de memoria.

¿Cómo puedo lograr esto, es decir, no usar cadenas para las contraseñas en Wicket?

Esta página tiene un ejemplo con cadenas.

    
pregunta DanielE 10.04.2014 - 12:08
fuente

1 respuesta

1

En realidad, no realmente puede "eliminar la contraseña de la memoria". Hoy en día no.

En tiempos anteriores , las estrategias de asignación de memoria en máquinas virtuales Java eran relativamente simples; cuando se asignó un bloque, se le asignó una vez y permaneció en la memoria, hasta que GC decidió que ya no era alcanzable y, por lo tanto, podría ser lanzado. En ese modo, la asignación es similar a lo que los programadores de C llaman malloc() . Para estas JVM, el GC fue conservativo : no siempre detectó de manera confiable si un dato dado en la memoria era un puntero u otra cosa (por ejemplo, un número entero o algunos caracteres), y por lo tanto asumí que todo lo que parecía un puntero tenía que ser tratado como tal, para propósitos de recolección de basura.

Dado que Java es un lenguaje estrictamente tipado, permitió las implementaciones de GC más estrictos que tienen un gran conocimiento de qué es un puntero y qué no lo es. Esto permite a estos GC mover objetos en la memoria. Por su parte, en el código fuente de Java, esto es completamente transparente. Pero internamente, el GC puede decidir mover un objeto de un emplazamiento en la RAM a otro, corrigiendo automáticamente todos los punteros para apuntar ahora a la nueva copia del objeto. Hacerlo permite muchas optimizaciones que hacen que este tipo de GC sea bastante deseable (mejor coherencia de caché, asignación muy rápida ...). Todas las JVM de la última década utilizan algoritmos GC tan mejores.

Sin embargo, una consecuencia de estos GC más recientes y mejorados es que las copias antiguas de los objetos pueden permanecer en la RAM. Cuando "borras" un char[] , solo estás escribiendo en la última copia en memoria de la matriz; Los restos de copias anteriores aún pueden estar allí y contener su contraseña, completamente fuera de su alcance ya que todo esto se hace de forma transparente, invisible desde el desarrollador.

Por lo tanto, la tradición de almacenar contraseñas en char[] y borrarlas es solo eso: una Tradición. Se solía justificarse, en días del siglo anterior, cuando la JVM estaba usando un GC conservador. En ese momento, la limpieza funcionaba y realmente estaba eliminando datos secretos de la memoria. Estos días han terminado. La limpieza programada ya no funciona. Por lo tanto, no tiene sentido hacer una diferencia entre char[] y String ; simplemente use el String y termine con él.

Si cree en la importancia de la limpieza, la manera correcta de hacerlo es integrar la limpieza automática en el GC, que se aplica sistemáticamente a todos los objetos. No sé si la JVM actual de Oracle (o OpenJDK) ofrece una opción para eso.

    
respondido por el Tom Leek 10.04.2014 - 15:58
fuente

Lea otras preguntas en las etiquetas