¿Por que no debemos usar String para almacenar datos sensibles en Java?

Últimamente he tenido que lidiar con datos comprometedores en mis desarrollos con los que se necesita tener especial cuidado, y la conclusión a la que he llegado es que no se debe usar String para datos sensibles.

¿Por que no debemos usar String?

El tipo de datos String es “inmutable”, por lo tanto, no podemos cambiar el valor del objeto una vez que lo hemos creado. Esto hace que el valor de un String se almacene en memoria y su limpieza dependa del garbage collector. Por esta razón, si usamos un String para almacenar un dato sensible, nunca podremos garantizar que su valor se haya borrado de memoria ya que no tenemos un control sobre la ejecución del garbage collector, y por tanto, nuestro dato será sensible a un volcado de memoria.

¿Que podemos hacer entonces?

Java recomienda usar otros tipos de objetos para almacenar este tipo de valores, como por ejemplo el array de caracteres (char[]). El char[] es una cadena de caracteres y es “mutable” de manera que cuando terminamos de usarlo podemos asignar un ‘\0’ a cada uno de sus elementos y forzar el borrado del contenido. De esta manera no dependemos de que el garbage collector libere la memoria asignada al objeto.