¿Por qué getText () en JPasswordField estaba en desuso?

Nunca pensé antes, solo utilicé el método getPassword que devolvía una matriz de caracteres y vi que el método getText estaba en desuso . Pero ahora que pienso, ¿por qué este método fue desaprobado ?

La documentación de Java explica:

Obsoleto . A partir de Java 2 platform v1.2, reemplazado por getPassword .

Obtiene 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 está en desuso. Use el método getPassword lugar.

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

Gracias de antemano.

Al llamar a getText obtienes un String (objeto inmutable) que no se puede cambiar (excepto el reflection) y la contraseña permanece en la memoria hasta que se recolecta la basura.

Al llamar a getPassword obtienes una matriz char que puede modificarse, por lo que la contraseña realmente no permanecerá en la memoria.

La razón para esto es que si solicita la contraseña como una Cadena 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 progtwig externo.

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

Prueba esto :

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

La razón detrás de este comportamiento es el conjunto de cadenas de Java (consulte, por ejemplo, esta pregunta SO para obtener más información). Tan pronto como convierta el contenido de ese campo de contraseña en una String (que es lo que sucede si usa el método getText ), la String se coloca en el grupo y otros pueden leerla.

Si getPassword la implementación del método getPassword (como se puede ver en la pregunta de SO @Garbage publicada como comentario de tu pregunta), puedes ver que 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 todavía terminas poniendo la contraseña en el grupo, y entonces podrías haber usado fácilmente el método getText .