Porque es preferible usar char[] en vez de String en contraseñas


En Swing, los campos de contraseña tienen un método getPassword() que retorna un char[] en vez de un String. Además siempre se dice que no se deben usar Strings para manejar contraseñas.

La razón de esto es que las String son inmutables, es decir que una vez se crean (y aun si se sobrescriben), si otro proceso pudiera hacer un volcado de memoria, no hay forma de deshacerse de esa información antes de que entre el colector de basura de Java (JVM's GC).
Con un arreglo, se puede explicitamente eliminar la información contenida después de usada haciendo sobre-escrituras, y la contraseña de ésta manera no estará disponible en ningún otro lado en el sistema, incluso antes de que  entre el colector de basura de Java (JVM's GC).
Una última razón seria la de la impresión. Con un String se tienen altas chances de imprimir las contraseñas a los registros, monitores o algún lugar inseguro. Char[] es menos vulnerable. Veamos esto en un ejemplo:

public static void main(String[] args) {
    Object pw = "Password";
    System.out.println("String: " + pw);

    pw = "Password".toCharArray();
    System.out.println("Array: " + pw);
}
Esto Imprime:
String: Password
Array: [C@5829428e


Así que es solo una cuestión de seguridad, pero aún usando un char[] solo reduce la oportunidad de un atacante, así que otros métodos también deberían tomarse en cuenta.

No hay comentarios:

Publicar un comentario