2012-05-04 47 views
22

Nunca pensé antes, solo utilicé el método getPassword que devolvía una matriz de caracteres y había visto que el método getText era obsoleto. Pero ahora que lo pienso, ¿por qué este método fue obsoleto?.¿Por qué getText() en JPasswordField estaba en desuso?

documentación de Java explica:

DEPRECATED. A partir de la plataforma Java v1.2, reemplazado por getPassword.

Recupera una parte del texto representado por el componente. Devuelve una cadena vacía si la longitud es 0.

Por razones de seguridad, este método es obsoleto. Use el método getPassword en su lugar.

Pero ¿cuáles son esas razones de seguridad ? Alguna idea sobre esto?

Gracias de antemano.

+2

http: // stackoverflow.com/questions/983964/why-does-jpasswordfield-getpassword-create-a-string-with-the-password-in-it – Garbage

Respuesta

36

Al llamar al getText, obtiene un String (objeto inmóvil) que no se puede cambiar (excepto el reflejo) y la contraseña permanece en la memoria hasta que se recoge la basura.

Cuando llame al getPassword obtendrá una matriz de caracteres que se puede modificar, por lo que la contraseña realmente no permanecerá en la memoria.

8

La razón de esto es que si solicita la contraseña como String en lugar de una matriz de caracteres, esta cadena que contiene la contraseña ahora va a flotar en la memoria del tiempo de ejecución de Java durante un período de tiempo no especificado. Es posible que sea leída desde allí por un componente de Java deshonesto o un programa externo.

Al usar una matriz de caracteres en su lugar, puede verificar la contraseña y luego codificarla de inmediato.

5

El motivo de este comportamiento es el conjunto de cadenas de Java (consulte, por ejemplo, this SO question para obtener más información). Tan pronto como convierta el contenido de ese campo de contraseña en String (que es lo que sucede si usa el método getText), el String se coloca en el grupo y puede leerse por otros.

, cuando se mira en la implementación del método getPassword (como puede verse en el SO question @Garbage registró como un comentario sobre tu pregunta) se puede ver esto evita cuidadosamente la creación de un String.

Tenga en cuenta que esto también significa que no debe hacer algo como

if (Arrays.equals("mySuperSecretPassword".toCharArray(), passwordField.getPassword())) 

o que aún así terminar con poner la contraseña en la piscina, y luego con la misma facilidad podría haber utilizado el método getText.

+0

El "conjunto de cadenas de Java" es para constantes internas en el momento de la compilación. Me pregunto si una entrada de texto Swing estándar * realmente * internan valores de texto ingresados ​​en ella. Según tengo entendido, al devolver una matriz char [] en lugar de la inmutable String permite que la contraseña se ponga a cero inmediatamente para minimizar la exposición/visibilidad en la memoria operativa (práctica recomendada de seguridad). Nunca se esperaría que The String fuera 'interno' de ninguna manera. –

5

Prueba esto:

String myPass=String.valueOf(passwordField.getPassword()); 
+1

El OP no pregunta * cómo obtener la contraseña como 'Cadena' *; él pregunta * por qué la contraseña se devuelve como 'CharrArray' en lugar de' Cadena'. – Barranka

Cuestiones relacionadas