2. Por qué la matriz de caracteres es más adecuada para almacenar contraseñas que String en Java

Otro problema complicado de Java basado en String, creo que solo unos pocos programadores de Java pueden responder esta pregunta correctamente. Esta es una pregunta central de la entrevista de Java realmente difícil, y se requiere un conocimiento sólido de String para responder a esta pregunta.

Esta es una pregunta que le hice a un amigo mío en una entrevista de Java recientemente. Está siendo entrevistado para el cargo de director técnico y tiene más de 6 años de experiencia. Si no se ha encontrado con esta situación, las matrices de caracteres y las cadenas se pueden utilizar para almacenar datos de texto, pero es difícil elegir una sobre la otra. Pero como dijo mi amigo, cualquier pregunta relacionada con cadenas debe tener algunas pistas sobre las propiedades especiales de la cadena, como la inmutabilidad, y la usa para convencer al interrogador. Aquí, exploraremos algunas de las razones por las que debería usar char [] para almacenar contraseñas en lugar de String.

Cuerda:

1) Dado que las cadenas son inmutables en Java, si almacena la contraseña como texto sin formato, estará disponible en la memoria hasta que el recolector de basura la borre. Y para su reutilización, habrá una cadena en el grupo de cadenas, es probable que permanezca en la memoria durante mucho tiempo, lo que representa una amenaza para la seguridad.

Dado que cualquier persona con acceso al volcado de memoria puede encontrar la contraseña en texto sin formato, esta es otra razón, siempre debe usar contraseñas encriptadas en lugar de texto sin formato. Dado que la cadena es inmutable, el contenido de la cadena no se puede cambiar, porque cualquier cambio producirá una nueva cadena, y si usa char [], puede establecer todos los elementos en espacios en blanco o ceros. Por lo tanto, almacenar contraseñas en matrices de caracteres puede reducir significativamente el riesgo de seguridad del robo de contraseñas.

2) El propio Java recomienda usar el método getPassword () de JPasswordField, que devuelve un char [] y el método getTex () obsoleto, que devuelve la contraseña en texto plano, por razones de seguridad. Siga las recomendaciones del equipo de Java y adhiérase al estándar en lugar de oponerse.

3) Cuando se usa String, siempre existe el riesgo de imprimir texto sin formato en el archivo de registro o en la consola, pero si se usa Array, no se imprimirá el contenido de la matriz, sino su ubicación en la memoria. Aunque no es una razón real, todavía tiene sentido.

String strPassword =“Unknown”; 
char [] charPassword = new char [] {'U','n','k','w','o','n'}; 
System.out.println(“字符密码:”+ strPassword);
System.out.println(“字符密码:”+ charPassword);

Producción

Cadena de contraseña: Contraseña de
carácter desconocido : [C @ 110b053
También recomiendo usar una contraseña cifrada o con hash en lugar de texto sin formato, y borrarla de la memoria inmediatamente después de que se complete la verificación. Por lo tanto, en Java, el uso de matrices de caracteres para almacenar contraseñas es una mejor opción que las cadenas de caracteres. Aunque solo usar char [] no es suficiente, también debe borrar el contenido para estar más seguro

Supongo que te gusta

Origin blog.csdn.net/weixin_45627031/article/details/112852627
Recomendado
Clasificación