2009-09-27 23 views
5

Estoy escribiendo una aplicación que necesita leer un nombre de usuario y contraseña y almacenarlos para que el programa pueda leerlos más tarde. Almacenarlo en algunas variables suena como una idea estúpida.Guardar contraseñas dentro de una aplicación

Encontré ese KDE library, pero tiene demasiada dependencia, y soy un programador novato para entender cómo usarlo.

¿Cuáles son los métodos comunes para almacenar contraseñas y cómo puedo resolver mi problema?

Respuesta

7

Depende de lo que va a hacer con la información.

Si va a utilizar el nombre y la contraseña para acceder a algún servicio externo (pero el usuario tendrá que volver a ingresar la información la próxima vez que ejecute el programa), entonces almacenarlos en algunas variables está bien. Puede ser conveniente almacenarlos encriptados (al menos, almacenar la contraseña encriptada) para que no estén visibles en los volcados centrales o su equivalente. Cuando se necesita la contraseña, la descifras, la usas y luego escribes donde se almacenó la versión descifrada (sacándola). (Nota: el hashing no es apropiado en este contexto, debe poder ver la contraseña y no puede deshacer un hash). Puede decidir almacenar la información fuera del programa (en un archivo de disco), pero no parece necesario. Tenga en cuenta que el binario aún contendrá la clave de encriptación (y el algoritmo de encriptación), y los datos encriptados son más aleatorios que los contenidos promedio de su programa, por lo que realmente ocultar la contraseña encriptada es muy difícil (casi imposible). Sin embargo, puedes hacer que sea lo suficientemente difícil como para detener a todos los atacantes menos decididos.

Si va a almacenar el nombre de usuario y la contraseña como un registro permanente para que pueda validar que el mismo usuario está accediendo a la información en el futuro, debe usar almacenamiento externo al programa; utilizará una base de datos simple, que podría ser tan simple como un archivo de texto sin formato si se asegura de resolver los problemas de simultaneidad. En este caso, deberá actualizar la contraseña con algo de sal, y almacenará el nombre de usuario, la contraseña saliente y la contraseña hash de tal forma que, dado el nombre de usuario, pueda encontrar fácilmente los otros dos valores.


Corredor de la sombra comentarios:

uso esa contraseña para acceder a alguna base de datos web, por lo que necesitan que se almacena en mi solicitud después de que se introduce por primera vez. ¿Estás seguro de que un archivo de texto plano es una idea inteligente?

Depende de cómo conciba 'almacenado en mi aplicación'. No puede modificar el ejecutable, o al menos no debería intentar hacerlo. Por lo tanto, debe considerarlo como un registro permanente almacenado en algún tipo de archivo separado del ejecutable de la aplicación. Por otro lado, te enfrentas a un problema diferente de lo que describí: no estás autenticando al usuario con la información; necesita descifrar la información a petición para enviarla a otras aplicaciones.

En primer lugar, eso significa que las sales y hash no son relevantes; necesita invertir la operación de enmascaramiento, y no puede invertir un hash.

A continuación, tiene que decidir cómo va a identificar al usuario de su aplicación sobre la reaparición. ¿El usuario estará obligado a ingresar una contraseña para acceder a sus propios datos, o simplemente dependerá de los privilegios del sistema operativo o de algún otro esquema?

Si el usuario debe ingresar alguna contraseña en su aplicación para comenzar, puede considerar usar esa contraseña (o un hash, distinto del hash de contraseña utilizado para reconocer la contraseña de la aplicación) para cifrar el nombre de usuario/combinación de contraseña para la aplicación externa. A continuación, puede almacenar el nombre de usuario y, por motivos de argumento, una versión codificada en base 64 de la contraseña cifrada en un archivo de texto; esto es tan seguro como la contraseña de la aplicación, que se almacena en el formato de hash salado original. Cuando el usuario vuelve, tienen que proporcionar su nombre de usuario y contraseña de la aplicación, y se puede validar que la combinación frente a los valores almacenados, y luego usar la contraseña para descifrar la contraseña a la aplicación externa.

Si el usuario no introduce una contraseña, entonces es más limitado en lo que puede hacer. Tienes que ser capaz de determinar una clave de algún modo de la información disponible para usted que se puede utilizar para almacenar la contraseña cifrada del usuario en un archivo en un lugar restringido, como un subdirectorio debajo de su directorio personal con ningún grupo o de acceso público:

mkdir ~/.appname 
chmod 700 ~/.appname 
cp /dev/null ~/.appname/app.key 
...store the encrypted information... 
chmod 500 ~/.appname 
chmod 400 ~/.appname/app.key 

esto es menos satisfactoria, porque incluso si se combina una llave fija con el nombre del usuario, por ejemplo, lo más probable es que alguien puede averiguar qué esa clave es (y la tecnología de encriptación) y técnicas de ingeniería inversa. (El secreto de los datos cifrados depende de las llaves; cuando la llave se puede determinar por el programa, sino que también se puede determinar por un atacante determinado Lo mejor es, con mucho, a confiar en que el usuario proporcione la clave (o una contraseña o. frase de paso) en tiempo de ejecución; a continuación, la aplicación no almacena nada que un atacante puede utilizar sin conexión

+0

uso esa contraseña para acceder a alguna base de datos web, por eso es necesario que se almacena en mi solicitud después de que entró por primera vez. ¿Estás seguro de que el archivo de texto plano es esa idea inteligente? –

+0

por lo que veo que el registro permanente es la mejor idea hasta ahora. la aplicación no tiene ninguna otra contraseña, y no mide que otros usuarios usarán esa aplicación. lo único es intentar guardar la contraseña + nombre de usuario de otra persona. –

+0

Sí, será necesario almacenar la información en algún archivo permanente. Use un archivo separado para cada usuario de la aplicación; almacene la contraseña cifrada en la codificación Base-64 (para que tenga un archivo de texto sin formato). Derive la clave utilizada para el cifrado de un hash criptográfico de las características que considere más fiables del usuario (tal vez una concatenación de su nombre de usuario y número de ID de usuario, y tal vez algún texto fijo), y almacénelo de forma segura una ubicación que puedas idear La seguridad es menos que perfecta: lo que puedes idear que tus atacantes puedan descubrir. –

0

qué tipo de aplicación es? Hay muchos métodos pero si es ASP.Net es común encriptar en el archivo web.config.

+0

Es multiplataforma Aplicación C++ (no un applet de Web) –

5

Por lo general, usted almacena el nombre de usuario y una versión hash de la contraseña. Ver este artículo de Wikipedia: hash functions, y esto question.

+2

hash de la contraseña no ayudará si necesita usar contraseña real después de iniciar sesión en el sistema remoto o algo por el estilo. –

+0

Absolutamente ..... – Peter

1

¿Qué hay de MySQL o SQLite hash de la contraseña y almacenarlos en una base de datos persistente, sin

1

Común.?? método para almacenar contraseñas para su uso posterior es almacenarlos en alguna caché cifrada. eso caché se cifra mediante alguna contraseña maestra. el usuario debe introducir la contraseña maestra cada vez que necesite la contraseña de la memoria caché. KeePassX es una pequeña aplicación de código abierto que utiliza contraseña maestra para almacenar datos personales (nombres de usuario, p palabras clave, etc.) Tiene una interfaz ligera, es multiplataforma y se publica bajo los términos de la Licencia Pública General de GNU. Puede verificarlo como muestra y usar algunas partes del mismo.

0

En spotep.com sólo almacenar el nombre de usuario y una código hash del nombre de usuario combinada con la contraseña. La ventaja de esto es que similair (a menudo triviales) contraseñas suele resultan en el mismo código hash (que se almacena en una cookie, y por lo tanto muy inseguro).

+0

buen sitio web, pero te perdiste muchas series caprica, battlestar galactica, hijos de la anarquía, etc ... –

+0

Hmm, No, ¿no? –

1

Yo sugeriría almacenar una contraseña hash en SQLite. Luego, cuando necesite verificar una contraseña, córtela y compárela con el valor almacenado. Esto mantiene las contraseñas almacenadas seguras para que nadie (ni siquiera usted) sepa cuáles son.

1

Usted podría intentar QSettings que proporciona configuración de la aplicación independientes de la plataforma persistentes. Las soluciones como mysql serían exageradas a menos que tengas cientos de contraseñas para almacenar.

Cuestiones relacionadas