¿cómo encriptar el usuario y contraseña de base de datos de aplicación java para escritorio?

He tenido este problema hace buen tiempo, pero como mis clientes ni idea sobre aplicaciones java, jar, etc, no le presté atención hasta que llegó un cliente que desensambló mi código que por cierto es bien fácil, buen en fin. Ofusqué el código pero aún queda el usuario y contraseña de la base de datos en los String que yo les asigno, claro está sino no funcionaría. La cuestión es que quiero que esos datos de la BD queden seguros, yo opté por asignar un usuario con ciertos privilegios sobre la BD, pero esto no me convence todavía.

¿Como podría encriptar esos String de usuario y pass de la BD?, para que no se carguen con esos datos tan importantes con solo desensamblar.

Saludos

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

¿Como estas especificando los

¿Como estas especificando los parametros de la conexion? ¿En un archivo de configuración de Spring? ¿Con un archivo persistence.xml? ¿Directamente en el codigo?

Saludos

Imagen de ezamudio

no los pongas

La única manera segura es que no estén en el código, ni en ningún archivo de recursos (un properties o lo que sea en el JAR). Eso implica que cada persona que quiere usar la app tendrá que poner el usuario y password al momento de iniciar, y si quieres que cada quien tenga uno distinto pues tendrán que administrar todo eso en la base de datos.

Imagen de ezamudio

PKI?

Otra opción un tanto complicada podría ser usando llave privada y pública, pero también administrativamente puede ser una pesadilla.

Y otra opción es cifrar esos datos con un algoritmo simétrico, usando PBE PKCS5v2 tomando como base alguna cadena que le das a quienes necesitan usar la app, para que la pongan la primera vez que corren la app y se guarde en su compu, tipo license key.

Jasypt facilita la encripcion

Jasypt facilita la encripcion de archivos de propiedades y muchas otras cosas asi que ahi esta una opción.

Imagen de edudev

nunca se me hubiera ocurrido

Entonces mi tabla de usuarios de la base de datos ya no tendría sentido, es decir un usuario de base de datos para cada usuario final nuevo, suena seguro... probaré...

Imagen de edudev

RE: Jasypt facilita la encripcion

Jasypt, esto suena bien, encriptaría mi usuario y pass BD y lo pondría en un ".properties" y para cargar el usurio BD desde código lo desencriptaría...

Imagen de ezamudio

pero cómo?

A ver, Jasypt puede cifrar un archivo (properties o de cualquier otro tipo) de manera "segura"? Suena a choro... si la llave está en código duro, la van a encontrar igual que encontraron el usuario y password originalmente. Si está en un archivo pues igual de fácil la encuentras. Si lo que hicieron fue usar un descompilador para ver el bytecode en forma de Java, se puede encontrar la parte en donde se descifra el archivo usando jasypt, ya que lo único que importa es encontrar la llave con que se descifran los datos.

Es el mismo problema que existió con iTunes y que existe con DRM y todos esos esquemas. Es a fin de cuentas el mismo principio que los candados esos para volantes de los coches; desmotivan al ladrón casual que buscaba robarse cualquier coche, porque si tu coche es más difícil de robar que el de junto, intentarán mejor robarse el de junto. Pero si tienes un jetta negro y el ladrón está buscando un jetta negro, se lo va a llevar, aunque le pongas lo que le pongas. El ladrón estará preparado con herramientas para quitar esos candados y mil trucos más que puedas usar para proteger tu coche.

Puedes tratar de ocultar una llave de encripción simétrica de la manera más enredada que se te ocurra en tu código, pero alguien con suficiente motivación la va a encontrar. Ahí la decisión que debes de tomar para la solución que requieres, pues depende de qué tan motivada está la gente que va a recibir esa aplicación.

La única solución segura es que no la llave no se encuentre en la aplicación sino que se guarde en un lugar externo, posterior a la instalación.

Asi es, en esencia solo se

Asi es, en esencia solo se trata de ofuscar mas los datos sensitivos pero a fin de cuentas, en algun lado tiene que encontrarse la contraseña, la llave etc.

Imagen de edudev

lo que había pensado...

Había pensado lo siguiente:
Encriptar con el sistema de llaves pública y privada.
Encriptar el usuario y pass con mi llave privada (altamente fuerte), y en la aplicación se desencripta con la llave pública, tendré que informarme que Jasypt soporte esto, también estaba leyendo con GnuPG

Imagen de ezamudio

???

Y de qué te sirve eso? Si cifras algo con tu llave privada, cualquiera que tenga tu llave pública puede descifrarlo. Y si la llave pública la incluyes en tu app, entonces para qué te molestas en cifrar datos con tu llave privada?

Cifrar datos con llave privada realmente sólo sirve para autentificar los datos cifrados; si puedo descifrar algo con tu llave pública, significa que fue cifrado con tu llave privada, y dado que es privada y sólo tú tienes acceso a ella, quiere decir que TU cifraste dichos datos. Ese es el principio de la firma digital.