2012-06-19 12 views
13

Estoy creando una aplicación y necesito conectarme a una base de datos. La base de datos requiere inicio de sesión/contraseña para que la aplicación pueda realizar operaciones como seleccionar e insertar.¿Cómo conectarse a una base de datos que requiere contraseña sin exponer la contraseña?

En la aplicación se necesita para conectarse a la base de datos mediante nombre de usuario y contraseña, por lo que la aplicación es libre de hacer algunas tareas en la base de datos. Mi pregunta es: ¿cómo almaceno y uso una contraseña para conectarme a la base de datos sin exponer la contraseña?

No puedo simplemente usar un hash o cifrado para almacenar la contraseña porque la base de datos debe reconocer la contraseña (creo que la mayoría o todas las bases de datos deben recibir la contraseña como texto sin formato).

.

.

Nota: La conexión la realiza la aplicación. Sin intervención humana para hacer la conexión.

(Editar) Más información sobre la aplicación: se trata de una aplicación web usando servlets/JSP. La base de datos está en el mismo servidor de la aplicación. El usuario de la aplicación es un usuario predeterminado sin poderes administrativos completos, pero puede insertar/eliminar filas y hacer la mayoría de las cosas que implican consultas y modificación de datos en tablas.

+0

¿Puede solicitarle a un operador una contraseña al inicio de la aplicación? – sarnold

+0

La conexión está hecha por la aplicación. Sin intervención humana. – ceklock

+3

Creo que necesita describir un poco más sobre el entorno de su aplicación. ¿Es esta una aplicación de servidor, aplicación cliente, es la base de datos en el mismo servidor, diferente servidor? ¿Ha creado un usuario con permisos solo para insertar? (¿No está tratando de iniciar sesión como root?) En general, debe 'dar información' y restringir el acceso de inicio de sesión a un rango de IP. –

Respuesta

10

La forma habitual de hacerlo es externalizar el nombre de usuario/contraseña a property/config file que se lee en tiempo de ejecución (utilice o no fuentes de datos JDBC/JNDI/CDI/J2EE nativas/etc).

El archivo está protegido mediante la seguridad de O/S por los administradores del sistema.

El O/S tiene mejores herramientas de protección que el código de la aplicación.

+1

¿Cómo acceder a este archivo? Está encriptado? ¿Tienes que descifrar las contraseñas? ¿Cómo paso la contraseña a la conexión de la base de datos? – ceklock

+0

no estoy seguro de cómo es seguro en las aplicaciones cliente (¿dónde está la contraseña en el cable)? Cuidado para elborar .... –

+1

Si desea evitar que alguien mire por encima del hombro y vea la contraseña cuando está editando el archivo de configuración, puede usar ['stringScrambler'] (https://github.com/kentcdodds/ Java-Helper/blob/master/src/com/kentcdodds/javahelper/helpers/OtherHelper.java # L66) en la biblioteca de ayuda de Java. Es realmente simple, pero realmente eficaz para evitar que las personas naveguen por su contraseña ... – kentcdodds

4

Si se trata de una aplicación web, desplegar en un servidor de aplicaciones Java EE y conectarse a través de un recurso JNDI. Solo el administrador que configuró el recurso de datos JNDI debe conocer las credenciales necesarias para conectarse. Los usuarios y desarrolladores ni siquiera tienen que conocerlos; solo el nombre de búsqueda JNDI.

No es posible eliminar por completo la necesidad de que alguien, además del propietario de la base de saber el nombre de usuario y contraseña, pero es posible restringir ese conocimiento para el propietario del servidor de aplicaciones.

Usted está también bien asesorado para crear credenciales separadas sólo por esa solicitud y la concesión que el mínimo acceso y permisos necesarios para llevar a cabo sus tareas. No debe haber conocimiento de las tablas del sistema ni de ningún otro recurso fuera de la provincia de la aplicación. SI el permiso DELETE no es necesario, no lo conceda. Si el acceso solo debe ser de lectura, eso es lo que debe otorgarle a esa credencial.

6

Puede utilizar jasypt para la tienda encryption.And el nombre de usuario y contraseña para el archivo datasource.properties.

public Connection getConnection() throws IOException{ 
    try{ 
     BasicTextEncryptor encryptor = new BasicTextEncryptor(); 
     encryptor.setPassword("jasypt"); 

     Properties props = new EncryptableProperties(encryptor); 
     props.load(this.getClass().getResourceAsStream("datasource.properties")); 

     String driver = props.getProperty("datasource.driver"); 
     String url = props.getProperty("datasource.url");   
     String userName = props.getProperty("datasource.userName");   
     String password = props.getProperty("datasource.password"); 

     Class.forName(driver); 
     Connection conn = DriverManager.getConnection(url, userName, password); 
     conn.setAutoCommit(false); 

     return conn; 
    } catch(ClassNotFoundException e) { 
     e.printStackTrace(); 
     return null; 

    } catch(SQLException e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 
+0

Es bueno saber la biblioteca jasypt. ¿Sabes si el proceso de cifrado/descifrado es seguro? Primero almacenaba en un archivo todas las contraseñas encriptadas que necesitaba, y luego intentaba descifrar las contraseñas (descifrar es el problema, porque creo que necesitaría otra contraseña ...). Pero parece que no necesita descifrar nada con esta biblioteca. Si funciona, es muy bueno. – ceklock

+0

Jasypt proporciona técnicas de cifrado unidireccionales y bidireccionales. Acabo de usar la biblioteca para la cadena de conexión. http://www.jasypt.org/features.html –

7

Debe usar un archivo de configuración para esto. ¡utiliza la primavera con JDBC para hacerte la vida más fácil!

http://www.youtube.com/watch?v=f-k823MZ02Q

Pedido el tutorial impresionante anterior en el marco de la primavera y el uso de JDBC. Mira todos sus tutoriales JDBC y primavera. Por cierto, él cubre cómo almacenar contraseñas en archivos de configuración y enviar frijoles, etc. Espero que esto ayude.

+0

Esas son una gran serie de tutoriales, pero el enlace no cubre el manejo de contraseñas. – dwjohnston

Cuestiones relacionadas