JavaRush /Blog Java /Random-ES /Preguntas y respuestas: ¿Por qué es mejor almacenar una c...

Preguntas y respuestas: ¿Por qué es mejor almacenar una contraseña en Java en una matriz de caracteres en lugar de una cadena?

Publicado en el grupo Random-ES
Es posible que escuche una pregunta así en una entrevista para el puesto Java Junior. Pero a mi amigo le preguntaron esto durante una entrevista para el puesto de Líder Técnico.
Preguntas y respuestas: ¿Por qué es mejor almacenar una contraseña en Java en una matriz de caracteres en lugar de una cadena?  - 1
StringSe pueden utilizar tanto , como una matriz de caracteres para almacenar datos de texto. Pero elegir conscientemente uno u otro para una tarea concreta es difícil si aún no te has encontrado con una situación similar. Sin embargo, como señaló mi amigo, cualquier pregunta relacionada con String, generalmente involucra una propiedad especial de las cadenas llamada inmutabilidad ( Immutable), y aprovechó esto en la entrevista. Entonces, veamos un par de razones por las que debería usar char []y no para almacenar su contraseña String.

Razón 1. Las cadenas son inmutables

Dado que las cadenas son inmutables en Java, su contraseña en texto plano estará disponible en la memoria hasta que el recolector de basura la borre. Y dado que Stringse utilizan String poolpara un uso repetido, existe una probabilidad bastante alta de que la contraseña permanezca en la memoria durante mucho tiempo, lo que no es nada seguro.
El grupo de cadenas de Java es un grupo o conjunto de objetos (cadenas) que se encuentra en un lugar especial: el montón. La cadena en Java es uno de los tipos de datos más comunes. Este no es un tipo primitivo, sino un objeto, ya que requiere muchos recursos. Entonces, para almacenar una cadena de cuatro caracteres, es necesario asignar 56 bytes de memoria. Es por eso que las cadenas, al igual que otros objetos, se almacenan en el montón.
Cualquiera que tenga acceso a un volcado de memoria puede encontrar la contraseña en texto sin formato, lo cual es una buena razón para utilizar una contraseña cifrada en lugar de texto sin formato. Como las cadenas son inmutables, su contenido no se puede cambiar. Cualquier cambio creará una nueva línea. Pero en el caso de char [], puedes reemplazar cualquiera de sus elementos con cero o un carácter vacío. Por lo tanto, almacenar la contraseña en una matriz de caracteres reduce claramente el riesgo de interceptación de la contraseña.

Razón 2. Recomendaciones de los autores.

El propio Java (bueno, a través de sus creadores, por supuesto) recomienda usar un método getPassword ()de la clase JPasswordFieldque devuelve char []. También puedes probar el método obsoleto getText (). ¿Por qué no seguir las recomendaciones de los autores del idioma?

Razón 3. Imprimir

Con un tipo Stringsiempre existe el peligro de que el texto almacenado en la cadena se imprima en el archivo de registro o en la consola. Al mismo tiempo, si usa Array, no imprimirá el contenido de la matriz, sino solo su ubicación en la memoria. Por supuesto, esto no es exactamente una razón seria, pero aún así tiene sentido.
String strPassword = "Unknown";
char [] charPassword = new char [] {'U', 'n', 'k', 'w', 'o', 'n'};
System.out.println ("String password:" + strPassword);
System.out.println ("char password:" + charPassword);

String password: Unknown
Character password: [C@110b053
Por supuesto, usar char []Java para almacenar contraseñas en sí mismo no es una panacea. Debe tomar precauciones de seguridad, como trabajar con hashes y cifrar contraseñas en lugar de almacenarlas en texto sin formato. Y, por supuesto, elimínelo de la memoria inmediatamente después del procedimiento de autenticación. Basado en materiales de Javarevisitado
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION