Tengo un proyecto Akka que necesita varias contraseñas para funcionar: para acceder a un almacén de datos, una cadena de conexión del sistema de archivos distribuido...
Esos valores no están codificados en el archivo de configuración, sino que se extraen de un almacén de claves en tiempo de ejecución durante el inicio de la aplicación y luego se almacenan en la memoria en un objeto de configuración con seguridad de tipos, ya que el tercero está usando esta configuración para obtener la contraseña y abrir las conexiones.
Solo me pregunto si de alguna manera esto es arriesgado, ya que supongo que las cadenas estarían claras en la memoria. ¿Hay alguna forma de ofuscar/cifrar los valores de forma transparente? ¿O necesito implementarlo de mi lado y actualizar a los terceros para que transformen la cadena antes de abrir las conexiones?
En mi opinión, eso es, en casi todas las aplicaciones, un riesgo de seguridad del que no debería preocuparse. Dado que Scala se ejecuta en la JVM, consulte: Datos confidenciales en la memoria .
Puede intentar usar sun.misc.Unsafe para borrar la memoria justo después de usar la contraseña:
String password = new String("l00k@myHor$e"); String fake = new String(password.replaceAll(".", "?")); System.out.println(password); // l00k@myHor$e System.out.println(fake); // ???????????? getUnsafe().copyMemory( fake, 0L, null, toAddress(password), sizeOf(password)); System.out.println(password); // ???????????? System.out.println(fake); // ????????????o a través de la reflexión:
Field stringValue = String.class.getDeclaredField("value"); stringValue.setAccessible(true); char[] mem = (char[]) stringValue.get(password); for (int i=0; i < mem.length; i++) { mem[i] = '?'; }http://mishadoff.com/blog/java-magic-part-4-sun-dot-misc-dot-unsafe/