Pregunta

Tengo un archivo de propiedades en Java, en el que almaceno toda la información de mi aplicación, como el nombre del archivo de la imagen del logotipo, el nombre de la base de datos, el usuario de la base de datos y la contraseña de la base de datos.
Puedo almacenar la contraseña cifrada en el archivo de propiedades.
Sin embargo, la clave o frase de contraseña se puede leer del jar usando un descompilador.
¿Hay alguna manera de almacenar el pase de base de datos en un archivo de propiedades de forma segura?

¿Fue útil?

Solución

Hay varias formas de gestionar esto.Si puede encontrar una manera de que un usuario proporcione una contraseña para un almacén de claves cuando se inicia la aplicación, la forma más adecuada sería cifrar todos los valores usando una clave y almacenar esta clave en el almacén de claves.La interfaz de línea de comando para el almacén de claves se realiza mediante keytool.Sin embargo, JSE también tiene API para acceder mediante programación al almacén de claves.

Si no tiene la posibilidad de que un usuario proporcione manualmente una contraseña para el almacén de claves al iniciar (por ejemplo, para una aplicación web), una forma de hacerlo es escribir una rutina de ofuscación excepcionalmente compleja que pueda ofuscar la clave y almacenarla en un archivo de propiedad también.Lo importante a recordar es que la lógica de ofuscación y desofuscación debe tener múltiples capas (podría implicar codificación, codificación, introducción de caracteres falsos, etc.).etc.) y debería tener al menos una clave que podría ocultarse en otras clases de la aplicación utilizando nombres no intuitivos.Este no es un mecanismo completamente seguro ya que alguien con un descompilador y una buena cantidad de tiempo e inteligencia aún puede solucionarlo, pero es el único que conozco que no requiere que ingreses al formato nativo (es decir.código no fácilmente descompilable).

Otros consejos

Almacena un hash SHA1 de la contraseña en su archivo de propiedades.Luego, cuando validas la contraseña de un usuario, aplicas un hash en su intento de inicio de sesión y te aseguras de que los dos hashes coincidan.

Este es el código que codificará algunos bytes por usted.Puede obtener fácilmente bytes de una cadena usando el getBytes() método.

/**
     * Returns the hash value of the given chars
     * 
     * Uses the default hash algorithm described above
     * 
     * @param in
     *            the byte[] to hash
     * @return a byte[] of hashed values
     */
    public static byte[] getHashedBytes(byte[] in)
    {
        MessageDigest msg;
        try
        {
            msg = MessageDigest.getInstance(hashingAlgorithmUsed);
        }
        catch (NoSuchAlgorithmException e)
        {
            throw new AssertionError("Someone chose to use a hashing algorithm that doesn't exist.  Epic fail, go change it in the Util file.  SHA(1) or MD5");
        }
        msg.update(in);
        return msg.digest();
    }

No no hay.Incluso si lo cifra, alguien descompilará el código que lo descifra.

Puede crear un archivo de propiedades separado (fuera del archivo jar) para las contraseñas (ya sea una contraseña directa de la base de datos o una frase de contraseña clave) y no incluir ese archivo de propiedades con la distribución.O es posible que pueda hacer que el servidor solo acepte ese inicio de sesión desde una máquina específica, de modo que sea necesario realizar una suplantación de identidad.

Además de cifrar las contraseñas como se describe anteriormente, coloque las contraseñas en un archivo de propiedades separado y, durante la implementación, intente otorgarle a este archivo los permisos más bloqueados posibles.

Por ejemplo, si su servidor de aplicaciones se ejecuta en Linux/Unix como root luego haga que el archivo de propiedades de la contraseña sea propiedad de root con 400/-r-------- permisos.

¿No podría hacer que la aplicación se ponga en contacto con un servidor a través de https y descargue la contraseña, después de autenticarse de alguna manera, por supuesto?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top