2010-08-10 4 views
11

Estaba leyendo acerca de la clase java.io.Console en uno de los libros de certificación de Java, posiblemente he omitido algo fundamental de un capítulo anterior, pero ¿alguien puede explicar el siguiente?Consola Java; readPassword, ¿cómo protege una matriz de la determinación del valor de la contraseña?

Menciona que el método readPassword devuelve una matriz de caracteres en lugar de una cadena, para evitar que un hacker potencial encuentre esta cadena y luego encuentre la contraseña.

¿Cómo es una matriz de caracteres más segura? Si pudiera obtener los valores en la matriz, ¿no podría crear una secuencia de comandos para recorrer varias combinaciones y, finalmente, encontrar la contraseña?

Respuesta

12

Desde el documentation:

objeto La consola soporta la entrada de contraseña segura a través de su método readPassword. Este método ayuda a asegurar la entrada de contraseña de dos maneras. Primero, suprime el eco, por lo que la contraseña no es visible en la pantalla del usuario. En segundo lugar, readPassword devuelve una matriz de caracteres, no una cadena, por lo que la contraseña puede sobrescribirse, eliminándola de la memoria tan pronto como ya no la necesite.

La idea aquí es que se puede llamar Arrays.fill (o equivalente) a la matriz de caracteres "en blanco" tan pronto como se haya validado la contraseña, ya partir de ese punto, la contraseña ya no se almacena en la memoria. Dado que las cadenas son inmutables, la cadena permanecerá en el montón hasta que se recolecte basura, lo que si logra hacerse internarse nunca será, y en cualquier otro caso podría ser "demasiado largo". Todo el tiempo que está allí, es potencialmente vulnerable a oler desde una variedad de vectores.

2

Una cadena es una clase inmutable, y cuando la contraseña está almacenada en un String no tiene control sobre su ciclo de vida, lo que significa que puede estar disponible en memoria (y sujeto a volcados de memoria y similares) durante un largo tiempo (incluso si no está internado, donde estaría en la memoria hasta que salga la JVM). Cuando se almacena en una matriz de caracteres, puede borrar la matriz y eliminar así la contraseña de la memoria una vez que la haya validado.

4

Es una de esas cosas de mejores prácticas. No tiene mucho sentido, pero lo hacemos para una vida fácil.

Si hay una contraseña en la memoria, un desbordamiento de lectura del búfer podría permitir su lectura. O podría guardarse en una imagen de clúster o hibernación. El uso de un char[] mutable permite destruir los datos, después de una ventana espesamente estrecha, siempre que no se haya copiado en una cadena, copiado en otro lugar, probablemente en búferes, recolección de basura le gusta mover objetos, etc.

Hay un ejemplo divertido en Swing, donde JPasswordField proporciona una forma char[] de leer los datos, pero por ejemplo creará un String de los datos si tiene un detector de acciones (que es una forma muy común de usarlo).

Cuestiones relacionadas