password encrypt java security password-storage

encrypt - md5 java



¿Cuál es la mejor práctica para almacenar de forma segura las contraseñas en Java? (3)

¿Cuál sería la forma recomendada para almacenar contraseñas en una aplicación de escritorio Java?

Quiero que el usuario tenga la capacidad de ingresar las credenciales solo una vez y que no se le vuelva a preguntar.

En proyectos personales, he estado usando la API de preferencias, pero supongo que esto no es diferente de almacenarlo en texto sin formato (desde el punto de vista de la seguridad).

Muchas gracias

EDITAR:

Muchas gracias por sus sugerencias. Parece que hay cierta confusión, sin duda porque podría no haber dejado la pregunta muy clara ...

Daré un escenario hipotético:

Digamos que estoy creando un front-end simple para una base de datos remota que crea una cadena de conexión con nombre de usuario / contraseña. Normalmente, se le solicitará al usuario que ingrese la combinación de nombre de usuario y contraseña cada vez que se inicie la aplicación.

Cuál sería la mejor manera de almacenar esa contraseña en la máquina del usuario, sin la necesidad de volver a ingresarla (conectándose automáticamente al iniciar la aplicación).

Una especie de funcionalidad "recuérdame" (que sé que en sí misma no es una buena práctica ...)

EDIT2:

Gracias por sus respuestas a todos. Paŭlo Ebermann''s fue muy informativo sobre los problemas actuales y el enlace de Chris Smith fue interesante, pero acepté el de JVerstry, ya que los almacenes de claves pueden ser la ruta que estoy tomando.


Independientemente del idioma, creo que esto se aplica: http://codahale.com/how-to-safely-store-a-password/

En resumen, use una función hash bCrypt.

La API de preferencias depende de la implementación de la memoria, por lo que estará a merced del proveedor de JVM. Si se trata de una JVM Sun / Oracle, es trivial obtener los datos. Sin embargo, si lo hash y aplicas una política de contraseña decente, será muy seguro. La contraseña original será muy difícil de determinar.


No hay manera de almacenar algo en una computadora de manera que su programa Java pueda recuperarlo (sin que el usuario ingrese alguna contraseña), pero ningún otro programa (ejecutándose en la misma cuenta del usuario) en esta computadora puede recuperarlo.

Puede intentar cifrarlo de alguna manera y ocultar el algoritmo de descifrado junto con la clave de descifrado en su programa (criptografía de caja blanca), pero luego el atacante solo necesita ejecutar su programa en un depurador para dejar que descifre los datos.

Puede usar el sistema de permisos del sistema, pero esto generalmente no ayudará si el atacante es un programa que se ejecuta en la misma cuenta de usuario que su programa Java (y ayudaría incluso menos si el atacante tiene acceso de root).

La mejor opción sería almacenar la contraseña en una memoria USB y decirle al usuario que la elimine cuando haya terminado de usarla, pero si el programa atacante se está ejecutando y está observando mientras lee el secreto del stick, incluso esto lo hace. no ayuda.


Puede utilizar un almacén de claves local donde podría colocar contraseñas en lugar de claves secretas.

Respuesta a editar:

Los almacenes de claves son un ajuste perfecto para su necesidad. Si desea protección adicional, puede pedirle al usuario una contraseña para acceder a todas las contraseñas cuando inicie la aplicación. Luego, podría proteger la contraseña de la base de datos almacenada con un método simple de extracción y extracción (para generar una clave de cifrado) utilizando la única contraseña que utilizó al iniciar la aplicación.