usuario - validar contraseña java
¿Cómo conectarse a una base de datos que requiere contraseña sin exponer la contraseña? (4)
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.
En la aplicación, necesito conectarme a la base de datos usando el nombre de usuario y la contraseña, para que la aplicación pueda realizar 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 es hecha por la aplicación. Sin intervención humana para hacer la conexión.
(Editar) Más información sobre la aplicación: es una aplicación web que utiliza 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.
Deberías 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
Consulte el increíble tutorial anterior sobre el marco Spring 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.
La forma habitual de hacerlo es externalizar el nombre de usuario / contraseña a un archivo de propiedad / configuración que se lee en tiempo de ejecución (ya sea que utilice o no origen de datos JDBC / JNDI / CDI / J2EE nativo / etc).
El archivo está protegido a través de la seguridad de O / S por los administradores del sistema.
El O / S tiene mejores herramientas para la protección que el código de la aplicación.
Puede usar jasypt para el cifrado. Y guarde el nombre de usuario y la contraseña en 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;
}
}
Si se trata de una aplicación web, impleméntela en un servidor de aplicaciones Java EE y conéctese utilizando un recurso JNDI. Solo el administrador que configuró el recurso de datos JNDI necesita 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 datos, conozca el nombre de usuario y la contraseña, pero es posible restringir ese conocimiento al propietario del servidor de la aplicación.
También se recomienda crear credenciales separadas solo para esa aplicación y otorgarle el acceso mínimo y los 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.