2010-09-24 14 views

Respuesta

45

El Preferences API es una buena manera de almacenar las preferencias del usuario y del sistema. Si desea almacenar contraseñas, deberá encriptarlas. Aquí hay un buen artículo que puede ayudarlo a comenzar.

Encrypted Preferences in Java

+14

¿Dónde almacenaremos la clave requerida? –

+5

Bonito tutorial de introducción aquí: http://www.mkyong.com/java/java-properties-file-examples/ –

+0

Quiero señalar que en Windows podría tener que cambiar el registro si está utilizando Preferencias. Para un usuario normal de su aplicación, esto podría ser un bloqueador (no-go!). –

25

que suelen almacenar en el directorio de datos de usuario, con los subdirectorios de nombre de la aplicación seguido de versión de la aplicación.

public static String getUserDataDirectory() { 
    return System.getProperty("user.home") + File.separator + ".jstock" + File.separator + getApplicationVersionString() + File.separator; 
} 

He estado utilizando el siguiente código durante 3 años. Este método funciona bastante bien en Windows, Linux o Mac.

Tenga en cuenta que, en Windows, nunca lo almacene en Program Files, ya que UAC en Windows Vista o posterior puede causarle muchos problemas.

Recuerde poner un punto en frente del nombre de su aplicación, de modo que se convierta en una carpeta oculta en Linux.

Lo bueno de usar esta metodología es que no está limitado a almacenar valores primitivos solamente. En su lugar, puede guardar todo el estado de los objetos en el disco mediante el uso de xstream

Por ejemplo:

public static boolean toXML(Object object, File file) { 
    XStream xStream = new XStream(); 
    OutputStream outputStream = null; 
    Writer writer = null; 

    try { 
     outputStream = new FileOutputStream(file); 
     writer = new OutputStreamWriter(outputStream, Charset.forName("UTF-8")); 
     xStream.toXML(object, writer); 
    } 
    catch (Exception exp) { 
     log.error(null, exp); 
     return false; 
    } 
    finally { 
     close(writer); 
     close(outputStream); 
    } 

    return true; 
} 
+0

¿Pero es seguro? ¿Estás almacenando contraseñas en texto plano? – djna

+1

Hay un caso para almacenar contraseñas en texto plano, en lugar de simplemente ofuscarlas: la ofuscación da una falsa sensación de seguridad. Ver por ejemplo http://developer.pidgin.im/wiki/PlainTextPasswords – gustafc

+0

Antes de almacenar una contraseña, utilizaré http://www.jasypt.org/ para realizar el cifrado. Actualmente, codifico mi clave de cifrado en mi aplicación. Una vez pensé en dejar que el usuario especificara la clave. Sin embargo, eso puede evitar que el usuario promedio use mi aplicación, ya que es difícil explicar cuál es la clave. Por lo tanto, renuncio a la idea. Hasta el momento, no recibo ninguna queja sobre cuestiones de seguridad al hacerlo. –

13

Almacenamiento de una sola contraseña segura es bastante difícil. Supongamos que encriptas la contraseña usando alguna clave secreta. Luego, cuando su aplicación comienza de nuevo, necesita esa clave secreta, ¿de dónde saca eso?

Si le pregunta al usuario, entonces también podría simplemente ingresar la contraseña de ftp que almacenó en primer lugar. Si lee la clave secreta de algún lado, entonces necesitas asegurar la clave secreta, y estamos de vuelta donde comenzamos.

Si conservas varias contraseñas, entonces pedirle al usuario una contraseña única para un "almacén" puede ser mucho más amistoso, pero luego tienes que lidiar con las contraseñas caducadas.

Hay productos disponibles para tratar este tipo de cosas, si tiene una necesidad seria, entonces probablemente necesite investigarlas.

Cuestiones relacionadas